动态SQL的官方解释:
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
本质上动态SQL就是在SQL层面,执行对应的逻辑代码,实际上还是一个sql语句
mybatis提供四个标签进行sql的动态的处理
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
if标签的使用
//if标签内test写上对应逻辑代码,相当于if()
<update id="updateBlog" parameterType="map">
update bloghys
<set>
<if test="author !=null">
author = #{author},
</if>
<if test="view !=null">
view = #{view}
</if>
</set>
where id=#{id}
</update>
trim(where,set)标签的使用,相应说明在下面代码注释中
//where实例,where标签内会自动清楚多余and 和or,当子属性一个至少有一个条件满足时,where才会插入。
//例如title参数是空,where就不会插入
<select id="selectBlog" parameterType="map" resultType="blog">
select * from bloghys
<where>
<if test="title !=null">
and title like concat(‘%‘,#{title},‘%‘)
</if>
</where>
</select>
//set实例,set标签内会自动清楚多余的",",当子属性一个至少有一个条件满足时,set才会插入。
<update id="updateBlog" parameterType="map">
update bloghys
<set>
<if test="author !=null">
author = #{author},
</if>
<if test="view !=null">
view = #{view}
</if>
</set>
where id=#{id}
</update>
//trim标签实例,where和set其实都trim标签,它有四个参数可以使用
//prefix表示插入最前面的需要插入的字段,suffix表示最后面的字段
//suffixOverrides表示结尾剔除的东西
//prefixOverrides表示开头剔除的东西 下面就是set的例子,和set效果一致
<update id="updateBlog" parameterType="map">
update bloghys
<trim prefix="set" suffixOverrides=",">
<sql id="if-author-view">
<if test="author !=null">
author = #{author},
</if>
<if test="view !=null">
view = #{view}
</if>
</sql>
</trim>
where id=#{id}
</update>
choose(when,otherwise)使用
//相当于java的switch语句,选择一个且只能选择一个,条件满足时,其他when就不在匹配,所有的when都不满足,就会满足oherwise
<select id="selectBlogChoose" parameterType="map" resultType="blog">
select * from bloghys
<where>
<choose>
<when test="title !=null">
and title=#{title}
</when>
<otherwise>
and view=#{view}
</otherwise>
</choose>
</where>
</select>
foreach的使用,这个使用入参时区分三种情况,当入参是集合时,collection=list,当入参是数组是collection=array,
当入参是map集合时,collection等于map里对应key值
//foreach有六个参数,collection对标集合,item代表集合里每个元素,名字随便取,下面语句会使用这个参数,
//index代表索引,一般不用,open代表返回的集合以什么开始,cloes代表以什么结束,
separator代表分隔符,一般都是用来in(1,2,3) 所以open="(" close=")" separator="," 一般这样使用
<select id="selectBlogbyForeach" parameterType="list" resultType="blog"> select * from bloghys <where> id in <foreach collection="list" open="(" close=")" separator="," item="item"> #{item} </foreach> </where> </select>
SQL片段使用
当需要用的sql语句存在大幅使用时,可以将他提取为公共片段,然后用include引入,代码如下
<update id="updateBlog" parameterType="map">
update bloghys
<trim prefix="set" suffixOverrides=",">
<include refid="if-author-view"></include>
</trim>
where id=#{id}
</update>
<sql id="if-author-view">
<if test="author !=null">
author = #{author},
</if>
<if test="view !=null">
view = #{view}
</if>
</sql>