【JavaEE】MyBatis 动态SQL 使用讲解

14 篇文章 0 订阅
4 篇文章 0 订阅


动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 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使用讲解完毕 ~
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值