什么是动静SQL?

动静SQL就是指依据不同的条件生成不同的SQL语句。

如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动静 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,须要花工夫理解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素品种,当初要学习的元素品种比原来的一半还要少。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

if

<select id="queryBlogIF" parameterType="map" resultType="Blog">    select * from mybatis.blog where 1=1    <if test="title != null">        and title = #{title}    </if>    <if test="author != null">        and author = #{author}    </if></select>

where

where 元素只会在子元素返回任何内容的状况下才插入 “WHERE” 子句。
若子句的结尾为 “AND” 或 “OR”,where 元素也会将它们去除。
改写下面if的动静sql为:

<select id="queryBlogIF" parameterType="map" resultType="Blog">    select * from mybatis.blog    <where>        <if test="title != null">            and title = #{title}        </if>        <if test="author != null">            and author = #{author}        </if>        </where></select>

choose、when、otherwise

<select id="queryBlogChoose" parameterType="map" resultType="Blog">    select * from mybatis.blog    <where>        <choose>            <when test="title != null">                and title = #{title}            </when>            <when test="author != null">                and author = #{author}            </when>            <otherwise>                and views = #{views}            </otherwise>        </choose>    </where></select>

SQL片段

有的时候,咱们可能会将一些性能的局部抽取进去,不便复用!
1.应用SQL标签抽取公共的局部

<sql id="if-title-author">    <if test="title != null">        title = #{title}    </if>    <if test="author != null">        and author = #{author}    </if></sql>

2.在须要应用的中央应用include标签援用即可

<select id="queryBlogIF" parameterType="map" resultType="Blog">    select * from mybatis.blog    <where>        <include refid="if-title-author"/>    </where></select>

注意事项:

  • 最好基于单表来定义SQL片段!
  • 不要存在where标签

foreach

<select id="queryBlogForeach" parameterType="map" resultType="Blog">    select * from mybatis.blog    <where>        <foreach collection="ids" item="id" open="and (" close=")" separator="or">            id = #{id}        </foreach>    </where></select>