动态 SQL 是 MyBatis 的强大特性之一,能够完成不同条件下不同的 sql 拼接。也就是说执行的 SQL 语句并不是固定的,而是不同人的不同操作执行的语句会有所差异。MyBatis 通过使用 标签 的方式来实现这种灵活性的。
<if>标签
例如在有一些网站进行注册的时候,会要求必须输入邮箱、密码,而那些年龄性别什么的则并不是必填项。这种场景下往数据库插入就可以使用 <if> 标签来实现。
UserMapper:
java
int addUser2(UserEntity user);
UserMapper.xml:
XML
<insert id="addUser2">
insert into userinfo(username,
<if test="photo != null">
photo,
</if>
password) values (#{username},
<if test="photo != null">
#{photo},
</if>
#{password})
</insert>
单元测试 验证:
添加 photo 属性:
不添加 photo 属性:
<trim>标签
**prefix:**前缀,如果后面有东西不为空就加上
suffix: 后缀,如果后面有东西不为空就加上
prefixOverrides: 要去除掉的前缀,如果存在的话
suffixOverrides: 要去除掉的后缀,如果存在的话
假设现在有种情况:全部数据都是非必传的,其中有一个数据传过来了,但是后面没数据就会导致 SQL 语句中多出来了一个 , 逗号就会导致报错。
为了解决这一问题就可以使用 <trim> 标签。这相当于是完善了 <if> 标签存在的不足。
<where> 标签
假设现在需要使用 where 条件进行对 id 或者 title 进行文章查询,使用 <trim> 标签实现:
使用 <where> 标签可以更加简单地表示(更加优雅的方式):
<set>标签
用在 update 修改操作里面的,跟 <where> 的使用一样,如果不传的话就不会生成,但是没有 set 的 update 是一个错误的 sql 语句,程序会报错。
<foreach>标签
**collection:**绑定⽅法参数中的集合,即表示需要 foreach 的是谁
item: 遍历时的每⼀个对象,每次循环的是什么
open: 语句块开头的字符串
close: 语句块结束的字符串
separator: 每次遍历之间间隔的字符串
当需要批量进行 添加、删除、修改 数据库的时候使用。下面是根据文章 id 来删除文章: