什么是动静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>