Dynamic SQL

北慕城南 提交于 2019-12-14 16:24:35

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(索引) 变量。它也允许你指定开头和结尾的字符串,并在迭代项之间添加一个分隔符。这个元素是很聪明的,它不会偶然地添加多余的分隔符。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!