MyBatis动态SQL

本文章是<<深入浅出MyBatis技术原理与实战>>的读书笔记.

概述

MyBatis的动态SQL包含如下所示的元素

元素作用备注
if判断语句单个条件的判断
choose,when,otherwise相当于Java中switch语句多重分支判断
where用于构造where的辅助元素处理where的拼接问题
set处理update中的set拼接问题

if元素

当传入的参数为null或者值为空时候,我们返回所有的行.

<select id="findByPattern" resultMap="resultMap" parameterType="string">
  select id,role_name,note from t_role where 1 = 1
  <if test="pattern != null and pattern != ''">
      and role_name like concat('%',#{pattern},'%');
  </if>
</select>

choos,when,otherwise元素

当我们需要根据role对象的条件来查找数据,有如下要求:

  1. 如果id不为空,则需要添加id查找条件.
  2. 如果roleName不为空,则需要添加roleName的like查询.
  3. note字段不能为null.
<select id="findByConditions" resultMap="resultMap" parameterType="roleParams">
   select id,role_name,note from t_role where 1 = 1
   <choose>
       <when test="params.id != null and params.id > 0">
           and id = #{params.id}
       </when>
       <when test="params.namePattern != null and params.namePattern != ''">
           and role_name like concat('%',#{params.namePattern},'%')
       </when>
       <otherwise>
           and note is not null
       </otherwise>
   </choose>
</select>

where, set元素

这两个是辅助元素.
我们在if元素的示例中看到, 有where 1=1这样的片段, 使用where元素可以使得更好看, 更容易理解.

<select id="findByPattern" resultMap="resultMap" parameterType="string">
    select id,role_name,note from t_role
    <where>
        <if test="pattern != null and pattern != ''">
            role_name like concat('%',#{pattern},'%');
        </if>
    </where>
</select>

对于set而言, 用在update的时候, 如果我们的一行有100个元素, 但是我们只有50个元素需要更新, 当我们传入一个Bean的时候, 利用set元素,我们可以直接忽略掉那些为null的字段,只是更新那些不为null的字段.

<update id="update" parameterType="role">
    update t_role
    <set>
        <if test="roleName != null and roleName != ''">
            role_name = #{roleName},
        </if>
        <if test="note != null and note != ''">
            note = #{note}
        </if>
    </set>
    where id = #{id}
</update>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值