MyBatis学习笔记总结【七】--动态SQL

本文详细介绍了MyBatis中的动态SQL元素,包括if、choose、set和foreach的使用方法及示例。通过这些元素,开发者能够根据条件灵活构建SQL语句,实现查询和更新的动态化。例如,利用if标签进行条件判断,choose标签实现多条件选择,set标签用于动态更新列,而foreach则用于遍历集合并构建动态条件。了解和掌握这些动态SQL技巧,能有效提高MyBatis的使用效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态SQL

动态SQL就是指根据不同的条件生成不同的SQL语句

MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

if

无需多说直接上实例

 <select id="queryBlogIF" parameterType="map" resultType="blog">
      select * from blog
       <where>
           <if test="title != null">
               and title = #{title}
           </if>
           <if test="author != null">
               and author =!{author}
           </if>
       </where>
   </select>

choose

多个条件中选择一个使用

<select id="queryBlogChoose" parameterType="map" resultType="blog">
       select * from blog
       <where>
           <choose>
               <when test="title != null">
                   title = #{title}
               </when>
               <when test="author != null">
                   and author = #{author}
               </when>
               <otherwise>
                   and views = #{views}
               </otherwise>
           </choose>
       </where>
   </select>

set

set 元素可以用于动态包含需要更新的列,忽略其它不更新的列。

<update id="updateBlog" parameterType="map">
      update blog
       <set>
           <if test="title != null">title=#{title},</if>
           <if test="title != null">author=#{author},</if>
           <if test="title != null">views=#{views},</if>
       </set>
       where id=#{id}
   </update>

[注] 这个例子中,set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。

sql片段

有的时候,我们可能会将一些功能的部分抽取出来,方便复用!
1.使用sql标签抽取公共部分

<sql id="if-title-author">
    <if test="title != null">
        title = #{title}
    </if>
    <if test="author != null">
        and author = #{author}
    </if>
</sql>

2.在需要的地方使用include标签引用即可

<select id="queryBlogIF" parameterType="map" resultType="blog">
    select * from blog
      <where>
          <include refid="if-title-author"></include>
      </where>
  </select>

注意:

  • 最好基于单表来定义SQL片段
  • 不要存在where标签。where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

foreach

动态 SQL 的另一个常见使用场景是对集合进行遍历

foreach 元素允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符。

<select id="queryBlogForeach" parameterType="map" resultType="blog">
  	select * from blog
     <where>
         <foreach collection="ids" item="id" open="and (" close=")" separator="or">
             id=#{id}
         </foreach>
     </where>
 </select>

提示: 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值