动态SQL就是指根据不同的条件生成不同的SQL语句
利用动态 SQL,可以彻底摆脱这种痛苦。
动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
public class Blog { private int id; private String title; private String author; private Date createTime; // 属性名和数据库不一致 设置 <setting name="mapUnderscoreToCamelCase" value="true"/> private int views; }
<select id="getBlogIf" parameterType="map" resultType="Blog"> select * from blog where 1=1 <if test="title != null"> and title = #{title} </if> <if test="author != null"> and author = #{author} </if> </select>
这条语句提供了可选的查找文本功能。如果不传入 “title”,那么所有数据都会返回
<select id="getBlogChoose" parameterType="map" resultType="Blog"> select * from blog <where> <choose> <when test="title != null"> title = #{title} </when> <when test="author != null"> and author = #{author} </when> <otherwise> and views = #{views} </otherwise> </choose> </where> </select>
传入了 “title” 就按 “title” 查找,传入了 “author” 就按 “author” 查找的情形。若两者都没有传入,就返回标记为 featured 的 BLOG
<select id="getBlogChoose" parameterType="map" resultType="Blog"> select * from blog <where> <if test="title != null"> and title = #{title} </if> <if test="author != null"> and author = #{author} </if> </where> </select>
where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
<update id="updateBlog" parameterType="map"> update blog <set> <if test="id != null">id=#{id},</if> <if test="title != null">title=#{title},</if> <if test="author != null">author=#{author},</if> <if test="views != null">views=#{views},</if> </set> where id=#{id} </update>
set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号。