Mybatis入门(十) 动态SQL

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

 

上一篇:提交代码时无Author


下一篇:Mybatis笔记(二)