java之mybatis

101 阅读4分钟

mybatis主要用于和数据库打交道的,相比之前的jdbc,mybatis有着更加强大的功能,接下来我来介绍一下mybatis的一些知识点.

由于前两章的知识点我们可以知道大概的目录结构如下

image.png

controller层去调用service层,然后service层去调用mapper层,然后返回给前端.这里需要明白一个点,数据库中的一个表,在java的entity包中对应一个实体类,同时在mapper包中对应一个接口,在同级目录中对应一个xml文件(等下详细说明),这里以员工表emp为例.

mysql中的表

image.png

entity中的实体类

image.png

mapper中的接口

image.png

同级目录下的xml文件

image.png

什么叫做同级目录呢?就是和mapper级别相同,因为resource是专门来存放资源的,所以我们在resource中新建了文件夹,和springmvc中的mapper同目录.springmvc中的mapper包位于com.cctv.user下,所以我们必须在resource中新建com包,然后在com包下新建cctv包,在cctv包下新建user包,接着就可以把xml文件放在包下了.

在xml文件中有四种标签,insert,delete,update,select分别对应着增删改查功能.而他们是如何执行的呢? 这些所有的标签都有一个id属性,就对应着那mapper中对应接口的方法.举个例子.

image.png

image.png 在EmpMapper接口中有一个名叫selectEmp的方法,而EmpMapper.xml文件中有一个select标签的id就是selectEmp,这样就完成了映射.只要调用了EmpMapper接口中的selectEmp方法就是执行EmpMapper.xml文件中id为selectEmp的标签里的sql语句.

接下来看一个实例.

1.在controller层调用service层的方法 image.png

2.service层调用mapper层的方法. image.png

3.mapper层中的接口的方法被调用就会执行xml文件对应标签的sql语法. image.png

我们的各种方法会接收到前端传递过来的参数,那么这些参数该如何传递到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来进行映射了. image.png

image.png 在resultMap标签里面,id是这个标签的名字,type代表映射那个类,resutl标签里面的colunm是数据库里面的字段,property代表是javaBean里面的属性,这样可以实现一一映射,然后在select标签里面可以用到resultMap来实现映射即可.

关于动态sql

1.if和where

image.png 这个where标签作用和mysql中where子句差不多,if条件中的test满足就会加上标签里面的内容,不满足则不会.

2.foreach

image.png foreach是为了实现sql中的in功能,foreach标签的collection里面的值必须是mapper接口中的@param别名

3.sql片段

image.png

image.png 可以用sql标签定义一些东西,然后在需要使用的时候直接通过include标签引用即可.

4.Mybatis常用的OGNL表达式

与: and

或: or

大于: gt

小于: lt

大于等于: gte

小于等于: lte

不等于: !=