目录
MyBatis的简介
pom.xml:
lombok插件:
使用mabatis完成crud
添加SQL日志
添加时返回递增的主键值
解决列名和属性名不一致。
mybatis中动态sql标签有哪些?
where标签
动态SQL
mybatis中完成模糊查询
MyBatis的简介
MyBatis 是一款优秀的持久层Dao框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Java实体类)映射成数据库中的记录.
并且可以简化jdbc的操作以及占位符赋值以及查询结果集的封装。
pom.xml:
“pom:是 Project Object Model的英文缩写,是项目对象模型的意思。通过xml可扩展标记语言(EXtensible Markup Language)格式保存的pom.xml文件。作用类似ant的build.xml文件,功能更强大。 作用:该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。”
在pom.xml中部署驱动器,就不用再引入驱动器,在大型项目汇总可以省很多内存
像下面这样直接引用就可以了
pom.xml
org.mybatis
mybatis
3.4.6
mysql
mysql-connector-java
8.0.16
org.projectlombok
lombok
1.18.24
junit
junit
4.12
test
junit
junit
4.12
test
org.junit.jupiter
junit-jupiter
RELEASE
compile
log4j
log4j
1.2.17
lombok插件:
Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。仅五个字符(@Data)就可以替换数百行代码从而产生干净,简洁且易于维护的Java类。
可以在pom.xml中引入lombok,代码如下:
org.projectlombok
lombok
1.18.24
还可以在实体类中添加lombok,数据仅供参考
User
@Data //set和get方法以及toString方法
@NoArgsConstructor //无参构造方法
@AllArgsConstructor //所有参数的构造方法
public class User {
private int userid;
private String username;
private String realname;
}
使用mabatis完成crud
添加SQL日志
在pom.xml中添加日志的jar包,代码如下
log4j
log4j
1.2.17
创建映射文件
select * from tb_user
注意: namespace必须和dao接口一样,而且标签的id必须和你接口的方法名一样。
为了预防出错,可以写一个测试类
@Test
public void testFindAll() throws Exception{
Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(resourceAsReader);
SqlSession session=factory.openSession();
//获取相应接口的代理对象
UserDao userDao=session.getMapper(UserDao.class);
List list = userDao.findAll();
System.out.println(list);
session.commit();
session.close();
}
我们在dao接口中某些方法可能需要传递多个参数,譬如: 登录(username,password),我们需要在参数处使用@Param()为参数起名。
添加时返回递增的主键值
需要返回添加数据库后的id值。
insert into tb_user values(null,#{username},#{realname})
解决列名和属性名不一致。
查询时返回一个null,或者某个列没有值,可以有两种解决办法:
第一种: 为查询的列起别名,而别名和属性名一致。
select stu_id id,stu_name name,stu_age age from tb_stu where stu_id=#{id}
第二种: 使用resultMap完成列和属性之间的映射关系。
select * from tb_stu where stu_id=#{id}
注意:如果列名和属性名有些一致的,可以在resultMap中不写映射关系
mybatis中动态sql标签有哪些?
1.if标签--用于单条件判断
//如果name不为null则按照name查询 如果为null则查询所有
public List findByCondition(@Param("name")String name,@Param("money") Double money);
select * from account where 1=1
and name=#{name}
and money=#{money}
choose标签--用于多条件分支查询
select * from account where 1=1 and name=#{name} and money=#{money} and isdeleted=0
where标签
我们观察到上面的sql都加了 where 1=1 ,如果不使用where 1=1 那么动态sql可能会出错。 我们能不能不加where 1=1呢! 可以 那么就可以使用where标签。
作用:可以自动为你添加where关键字,并且可以帮你去除第一个and或者or
select * from account and name=#{name} and money=#{money}
动态SQL
1.set标签:
这个配合if标签一起用,一般用在修改语句。如果传递的参数值为null,那么应该不修改该列的值。
update account
name=#{name},
money=#{money},
isdeleted=#{isdeleted},
created=#{created},
updated=#{updated},
where id=#{id}
2.foreach标签
循环标签
通过id查询所有
select * from account where id in
#{id}
删除:
#{id}
添加
SQL批量函数添加
insert into account(name,isdeleted) values('ldh',0),('ldh2',0),('ldh4',0)
insert into account(name,isdeleted) values (#{acc.name},#{acc.isdeleted})
mybatis中完成模糊查询
select * from 表名 where 列名 like '%a%'
(1)使用字符串函数 完成拼接 concat
select * from account where name like concat('%',#{name},'%')
(2) 使用${}
select * from account where name like '%${name}%'
通过观察: 发现使用${}实际上是字符串拼接,它不能防止sql注入, 而#{}它是预编译,它可以防止sql注入问题,#{}实际使用的PreparedStatement.
联表查询-
多对一 : 从多的一方来查询一的一方。
班级表:
例如:一个班级可以有很多学生,但是一个学生只能隶属于一个班级,不能同时在多个班级出现,这就是多对一和一对多。
学生表:
根据学生id查询学生信息并携带班级信息。
给两个表设置链接关系
select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=1
实体类:
Student:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private int id;
private String name;
private int age;
private String sex;
private Integer classId;
private Clazz clazz;//学生所属的班级
}
Class:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Clazz {
private Integer cid;
private String cname;
}
.xml
select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=#{id}



