动态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>