本文章是<<深入浅出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对象的条件来查找数据,有如下要求:
- 如果id不为空,则需要添加id查找条件.
- 如果roleName不为空,则需要添加roleName的like查询.
- 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>