MyBatis 最强大的特性之一是它的动态 SQL。如果你用过 JDBC 或其他类似的框架,你就知道根据不同条件拼接 SQL 语句有多痛苦了,比如不能忘记空格或要去掉最后一个列后面的逗号。动态 SQL 可以完全摆脱这种痛苦。
如果你使用过 JSTL 或任何类似的基于 XML 的文本处理器,那么动态 SQL 元素对你来说一点也不陌生。在 MyBatis 之前的版本中,有很多的元素需要去学习和理解。MyBatis 3 很大程度上优化了这一点,现在只需要使用比之前少于一半的元素。
Dynamic SQL
if
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
这个语句提供了一种可选的查找文本功能。如果你没有传进来一个 title,那么所有 ‘ACTIVE’ 状态的 Blog 都会被返回。如果你传入了一个 title,那么它会模糊查找匹配 title 的(细心的读者可能会发现,你的参数值需要包含一些掩码或通配符)。
choose, when, otherwise
有时候我们不想应用到所有的条件,而是从中选一个。MyBatis 提供了和 Java 中的 switch 语句很像的 choose 元素
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
trim, where, set
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE
<if test="state != null">
state = #{state}
</if>
<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>
where
MyBatis 提供了一个简单的答案可以在 90% 的情况下使用。在那些不适用的场景下,你也可以自定义来使它正常工作。只要小小的一个改变,一切都能正常工作:
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
where 元素只会在其包含的标签内有返回内容时才插入 “WHERE” 。而且,如果返回的内容是以 “AND” 或 “OR” 开头,它也会将其去除。
trim
prefixOverrides 属性采用管道分隔的文本列表进行覆盖,其中的空格也是必要的。它的作用是移除所有在 prefixOverrides 属性中指定的内容,并且插入在 prefix 中指定的内容。
suffixOverrides 属性采用管道分隔的文本列表进行覆盖,其中的空格也是必要的。它的作用是移除所有在 suffixOverrides属性中指定的内容,并且插入在 suffix中指定的内容。
suffix:添加后缀; prefix:添加前缀
foreach
动态 SQL 的另外一个重要点是对集合进行遍历,通常是构建一个 IN 条件。
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
foreach 元素是很强大的,它允许你指定一个 collection(集合),声明在元素体中可以使用的 item(集合项) 和 index(索引) 变量。它也允许你指定开头和结尾的字符串,并在迭代项之间添加一个分隔符。这个元素是很聪明的,它不会偶然地添加多余的分隔符。
来源:CSDN
作者:寒蝉知鸣
链接:https://blog.csdn.net/hanzhiming01/article/details/103539427