mybatis主要用于和数据库打交道的,相比之前的jdbc,mybatis有着更加强大的功能,接下来我来介绍一下mybatis的一些知识点.
由于前两章的知识点我们可以知道大概的目录结构如下
controller层去调用service层,然后service层去调用mapper层,然后返回给前端.这里需要明白一个点,数据库中的一个表,在java的entity包中对应一个实体类,同时在mapper包中对应一个接口,在同级目录中对应一个xml文件(等下详细说明),这里以员工表emp为例.
mysql中的表
entity中的实体类
mapper中的接口
同级目录下的xml文件
什么叫做同级目录呢?就是和mapper级别相同,因为resource是专门来存放资源的,所以我们在resource中新建了文件夹,和springmvc中的mapper同目录.springmvc中的mapper包位于com.cctv.user下,所以我们必须在resource中新建com包,然后在com包下新建cctv包,在cctv包下新建user包,接着就可以把xml文件放在包下了.
在xml文件中有四种标签,insert,delete,update,select分别对应着增删改查功能.而他们是如何执行的呢? 这些所有的标签都有一个id属性,就对应着那mapper中对应接口的方法.举个例子.
在EmpMapper接口中有一个名叫selectEmp的方法,而EmpMapper.xml文件中有一个select标签的id就是selectEmp,这样就完成了映射.只要调用了EmpMapper接口中的selectEmp方法就是执行EmpMapper.xml文件中id为selectEmp的标签里的sql语句.
接下来看一个实例.
1.在controller层调用service层的方法
2.service层调用mapper层的方法.
3.mapper层中的接口的方法被调用就会执行xml文件对应标签的sql语法.
我们的各种方法会接收到前端传递过来的参数,那么这些参数该如何传递到xml文件中去呢?这里就有必要说一下mybatis中的#{}和${},#{}叫做占位符,{}叫做拼接符.区别如下:
#{}:动态解析->预编译->执行
${}:动态解析->编译->执行
#{}:会在对应变量自动加上单引号"
${}:不会在对应的变量后加上单引号"
#{}:防止sql注入
${}:不能防止sql注入
关于mybatis参数问题
1.单个参数:selectEmp(Integer id);mybatis不会做任何特殊要求
获取方式:#{任何字符}
2.多个参数(务必设置参数别名:@Param(""))
Emp selectEmp(@Param("id")Integer id,@Param("username")String username);
id===>#{id}
username===>#{username}
3.javaBean单个参数 Emp selectEmp(Emp emp);
获取方式:直接使用属性名即可
emp.id====>#{id}
emp.username===>#{username}
4.javaBean多个参数(务必设置别名,@Param(""))
Emp selectEmp(@Param("num")Integer num,@Param("emp")Emp emp)
num===>#{num}
emp===>必须加上对象名#{emp.id}
5.集合或者数组
Emp selectEmp(@Param("username")List usernames);
如果是List,Mybatis会自动封装成map
如果是数组,Mybatis会自动封装成map
username.get(0) ===> #{username[0]}
6.如果是map,一般和javaBean对象一样处理.特殊情况,就是在跨表查询的时候会找不到对应的javaBean实例来进行映射,就用DTO(data transfer object)来处理.
DTO就是在entity中新建一个类,名字就在表名后面加一个DTO,见名知意.如,EmpDTO,这个实体类就可以自定义多个属性名用来映射到数据库中.
关于resultType和resultMap.
在select标签里面会有一个resultType用来映射javaBean实体类的,但是呢,javaBean中的有个属性名和数据库中的字段不会一一对应,这是需要用到另外一个resultMap来进行映射了.
在resultMap标签里面,id是这个标签的名字,type代表映射那个类,resutl标签里面的colunm是数据库里面的字段,property代表是javaBean里面的属性,这样可以实现一一映射,然后在select标签里面可以用到resultMap来实现映射即可.
关于动态sql
1.if和where
这个where标签作用和mysql中where子句差不多,if条件中的test满足就会加上标签里面的内容,不满足则不会.
2.foreach
foreach是为了实现sql中的in功能,foreach标签的collection里面的值必须是mapper接口中的@param别名
3.sql片段
可以用sql标签定义一些东西,然后在需要使用的时候直接通过include标签引用即可.
4.Mybatis常用的OGNL表达式
与: and
或: or
大于: gt
小于: lt
大于等于: gte
小于等于: lte
不等于: !=