MyBatis3 动态sql常用标签
动态sql是MyBatis的一大特性。
动态sql说白了就是在不改变数据库语言上进行添加标签完成相对复杂的操作功能。意思就是不能改变最终的数据库语言。
下面我介绍项目中最常用的几个标签
1、if标签
if标签类似java代码中的if,满足条件,则添加if标签内的sql语句。
例如:
<select id="qeuryStaff">
SELECT * FROM STAFF WHERE staff_sex= ‘男’
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
2、choose(when、otherwise)
类似 Java 中的 switch 语句
例如:符合某一个的条件则按哪句sql进行,注意和if标签的区别。
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
3、foreach
任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。
foreach多与in 搭配使用,例如:
<if test="black_staff != null and black_staff.length > 0">
AND rpb.double_STAFF_ID in
<foreach collection="black_staff" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</if>
colleaction是属性中的集合;
item是遍历出来的每个元素;
open是循环结果前边的东西;
close是循环结果后边要加的东西;
separator是循环结果用什么符号分隔;
4、set
set标记是mybatis提供的一个智能标记,一般将其用在修改的sql中
<update>
update user
<set>
<if test="name != null and name.length()>0">name = #{name},</if>
<if test="gender != null and gender.length()>0">gender = #{gender},</if>
</set>
where id = #{id}
</update>
在上述的代码片段当中,假如说现在三个字段不为null时,那么上面得到的SQL语句是:
update user set name=‘xxx’ , gender=‘xx’ where id=‘x’
在上面gender='xx’的后面是没有逗号的,所以说set标记已经自动帮助我们把最后一个逗号给去掉了。
5、trim(set、where)
trim标记是一个格式化标记,可以完成set或者是where标记的功能
select * from user
<trim prefix="WHERE" prefixoverride="AND |OR">
<if test="name != null and name.length()>0"> AND name=#{name}</if>
<if test="gender != null and gender.length()>0"> AND gender=#{gender}</if>
</trim>
这里prefix是指添加前缀where,prefixoverride是指删除多余的前缀AND或者是OR。
所以以上代码假如说name和gender的值都不为null的话打印的SQL为:select * from user where name = ‘xx’ and gender = ‘xx’
属性名 | 解释 |
---|---|
prefix | 要添加的前缀 |
prefixOverrides | 要删除的前缀 |
suffix | 要添加的后缀 |
suffixOverrides | 要删除的后缀 |