动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接。
1. if 标签
判断一个参数是否是有值的,如果没值,就会隐藏if中的SQL。
应用场景如下:
在注册用户功能时候,有些时候像头像就不是非必填的,如果没有填就是一个默认头像,也就是说,注册分为两种字段:必填字段和⾮必填字段,if 标签就是为了解决添加用户时候有不确定的字段传⼊时候的SQL拼接了。具体使用方法如下:
以数据库用户表为列,头像字段为非必填参数,且设置了默认值:
此时在注册添加用户时候,photo就是非必填字段:
mapper接口:
xml实现:
此时单元测试在传或不传photo时SQL均不会报错:
不传photo时生成SQL:
传photo时生成的SQL:
此时可以看到记录均添加成功:
注意 test 中填写的,是传⼊对象中的属性,不是数据库字段。
(所以在设计时候尽量保证数据库字段和对象属性名称一致)
2. trim 标签
trim标签最主要的作用是:去除SQL语句前后多余的某个字符。
之前的插⼊⽤户功能,只是有⼀个 photo 字段可能是选填项,如果有多个字段,⼀般考虑使⽤ trim 标签结合 if 标签,对多个字段都采取动态⽣成的⽅式,具体使用如下:
mapper接口声明如下:
xml实现如下:
属性解释如下:
- prefix:表示整个语句块,以prefix的值作为前缀
- suffix:表示整个语句块,以suffix的值作为后缀
- prefixOverrides:表示整个语句块要去除掉的前缀
- suffixOverrides:表示整个语句块要去除掉的后缀
这里我们整个语句块是(xxx),以()作为前后缀,且要去掉最后的 ,
(xxx,xxx,xxx ,)加黑的 , 就是要去除掉的,防止SQL报错执行失败
详情:在以上 sql 动态解析时,会将第⼀个 trim 部分做如下处理:
- 基于 prefix 配置,开始部分加上 (
- 基于 suffix 配置,结束部分加上 )
- 多个 if 组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于
suffixOverrides
配置去掉最后⼀个 , - 注意 if test=“username != null” 中的 username 是传⼊对象的属性
单元测试如下:
这里假设传入的三个参数都是有值的,拼接的SQL如下:
3. where 标签
where标签最主要的作用:实现查询中的where SQL替换的,它可以实现如果没有任何的查询条件,那么它可以去除查询中的where SQL;如果存在查询条件时,那么会生成where的SQL查询;并且使用where标签可以自动去除 最前面 的一个 and 字符。
where标签就是用户做条件查询时候的动态拼接;
比如在查询用户时候,输入查询条件就根据条件进行查询,如果没有输入查询条件就视为查询全部这种业务需求。
具体使用如下:
mapper接口:
xml实现:
这两种写法单元测试如下:
当传入有id,根据id查询时:
能够正确查询出id为1的用户记录:
当传入id为null时,也就是不传id的业务:
也能够正确查询出数据库中全部记录(博主测试时候为了方便打印输出数据表中就只有一个用户):
同时,这个where标签等价于 :
trim prefix=“where” prefixOverrides=“and” 标签
xml实现如下:
单元测试 id为1 或者 null 时情况如上不变,所以 where标签 和 trim标签可做等价替换。
4. set 标签
set 标签作用: 根据传⼊的⽤户对象属性来更新⽤户数据,使⽤ set 标签来指定动态内容。
进行修改操作时,配合 if 标签来处理非必传参数,特点是会自动去除掉最后一个英文逗号(,);
使用详情如下:
mapper接口:
xml实现:
单元测试:
修改id为1的用户信息:
执行结果如下:
数据表记录被成功修改:
和 where 标签一样,set 标签也可以使⽤ trim prefix="set" suffixOverrides=","
替换:
单元测试结果一样,同样能正确拼接SQL:
5. foreach 标签
作用:foreach标签是对集合进行循环的,对集合进⾏遍历时使⽤该标签。
foreach标签属性介绍:
- collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
- item:遍历时的每⼀个对象
- open:语句块开头的字符串
- close:语句块结束的字符串
- separator:每次遍历之间间隔的字符串
使用示例:根据传入的多个用户id进行删除用户信息:
mapper接口方法声明:
xml实现:
先在数据库中插入三条记录,id分别为下:
单元测试如下:
测试结果(拼接SQL)如下:
执行之后成功删除了id为25 26 27的三条用户记录:
注意事项:
- (五大常用)动态SQL使用讲解完毕 ~