动态SQL是MyBatis的强大特性之一,能够完成不同条件下不同的sql拼接。
参考官方文档:https://mybatis.org/mybatis-3/zh/dynamic-sql.html
<if>标签
看这个场景,有必填字段 和 非必填字段 ,当字段不确定是否传入的时候,程序员如何实现呢?
insert into user(name,age,brithday) values(?,?,?);
insert into user(name,age) values (?,?);
如上面的两个sql语句,当我们选择不同内容进行插入的时候,要使用不同的sql语句,而总不能每一种情况都写一遍吧?这时候我们就可以通过<if>标签 进行实现
if标签语法
<if test="birthday != null">//if后是
birthday
</if>
这些标签 是 MyBatis提供给我们的,在xml文件实现,如下面代码:
<trim>标签
如果上述的所有字段都是非必填项,那么都不填的情况下,只使用上述的<if>标签,那么就会导致报错,这时候就需要<trim>标签来配合使用了。<trim>标签会根据你传递的参数去决定是否要生成。
<trim>标签的属性:
• prefix(前缀):最前面的一个字符,插入时通常是 (
• suffix(后缀):最后面的一个字符,插入时通常是 )
• suffixOverrides(前缀覆盖):表示整个语句块要去除掉的前缀
• prefixOverrides(后缀覆盖):表示整个语句块要去除掉的后缀,插入时通常是 ' , ' 如下面图片所示,这样的话他会自动去掉 photo后面的 , 如果photo为null则会自动去掉 password后面的 ,
在以上 sql 动态解析时,会将第一个 <trim> 部分做如下处理:
基于 prefix 配置,开始部分加上 (
基于 suffix 配置,结束部分加上 )
多个 <if>组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于 suffixO
Overrides 配置去掉最后一个 ,
注意 <if test=“username != null”> 中的 createTime 是传入对象的属性
<where>标签
传入的用户对象,根据属性做 where 条件查询,用户对象中属性不为 null 的,都为查询条件。
如果条件里没有传递任何关于判断的内容,那么会自动不添加where限制,是一个动态的生成。
会根据你传递的参数,来决定是否要生成where
特征:
通常配合 <if> 一块使用
<where>标签只能去除最前面的 and 关键字。
<where> 标签 如果里面没有内容,那么就不会生成 where内容
<where> 标签 本身可以看做等价于 <trim prefix="where" prefixOverrides="and">
<set>标签
特征:
通常配合 <if> 一块使用
<set>标签只能去除最后一个 ' , '
<set> 标签 如果里面没有内容,会产生报错
<set> 标签 本身可以看做等价于 <trim prefix="set" suffixOverrides=",">
<foreach>标签
对集合进行遍历的时候使用这个标签
collection:绑定方法参数中的集合,如 List,Set,Map或数组对象
item:遍历时的每一个对象
open:语句块开头的字符串
close:语句块结束的字符串
separator:每次遍历之间间隔的字符串
使用情景:
1.使用的环境案例
delete from user where id in (1,2,3,4,5);
--当我们需要批量删除数据应该怎么实现?就可以使用<foreach>标签
2.使用<foreach>进行实现
--假设有一个List List<Integer> list = new ArrayList<>(); 里面有1,2,3,4,5
--下面就是使用<foreach>构造的代码
-- arr就是数组 item就代表数组里的内容 和foreach循环类似
-- open就相当于trim里的prefix close就相当于后缀suffix separator分割符
<delete id="deleteByIds">
delete from article
where id in
<foreach collection="arr" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</delete>