MyBatis 的动态 SQL 主要可以做以下几件事:
- 条件 WHERE 子句
使用 if 标签动态添加 where 子句。
<select id="findUser" parameterType="map" resultType="User">
select * from users
<where>
<if test="id != null">
and id = #{id}
</if>
</where>
</select>
- 多条件 AND/OR 语句
使用 choose/when/otherwise 标签实现多条件过滤。
<select id="findUser" resultType="User">
select * from users
<where>
<choose>
<when test="id != null">
and id = #{id}
</when>
<when test="email != null">
and email = #{email}
</when>
<otherwise>
and username = #{username}
</otherwise>
</choose>
</where>
</select>
- IN 语句
使用 foreach 标签实现 in 语句。
<select id="selectPostIn" resultType="map">
select * from post where id in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
- SQL 片段
使用 sql 标签定义可重用的 SQL 模块。
<sql id="selectColumns">
id, name, age
</sql>
<select>
select
<include refid="selectColumns">
</select>
- 其它
MyBatis 动态 SQL 还可以做:
- 去除多余的 AND/OR
- 嵌套 IF 语句
- 条件 ORDER BY 等
总的来说,MyBatis 的动态 SQL 主要解决了动态拼接 SQL 的复杂性,提供了易读易写与好维护的解决方案。同时也提高了 SQL 的复用性。