MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在 MyBatis 中,动态 SQL 是一个非常重要的特性,它允许在 SQL 语句中根据参数的值来动态地生成 SQL。
1、<if> 元素:
- 用于根据参数的值来决定是否包含某段 SQL。
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
2、<choose>, <when>, <otherwise> 元素:
- 类似于 Java 中的 switch-case-default 结构。
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
3、<where> 元素:
- 这个元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入 "WHERE" 子句。
- 若子句的开头是 "AND" 或 "OR",<where> 也会将它们去掉。
<select id="selectBlog" resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
</where>
</select>
4、<set> 元素:
- 用于动态地生成 SQL 的 SET 子句。
- 与 <where> 元素类似,<set> 元素会动态地处理 SQL 的 SET 子句,确保生成的 SQL 是有效的。
<update id="updateBlog" parameterType="map">
UPDATE BLOG
<set>
<if test="title != null">title=#{title},</if>
<if test="content != null">content=#{content},</if>
<if test="author != null">author_id=#{author}</if>
</set>
WHERE id = #{id}
</update>
5、<foreach> 元素:
- 在动态 SQL 中常用于 IN 查询或批量操作。
<select id="selectBlogIn" resultType="Blog">
SELECT * FROM BLOG WHERE id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
6、<bind> 元素:
- 在 OGNL 表达式之外创建一个变量,并将其绑定到当前的上下文。这样,你可以在后续的 SQL 语句中引用这个变量。