12、动态SQL
动态SQL就是指根据不同的条件生成不同的SQL语句
1、搭建环境
CREATE TABLE mybatis.`blog`(
`id` VARCHAR(50) NOT NULL COMMENT '博客id',
`title` VARCHAR(100) NOT NULL COMMENT '博客标题',
`author` VARCHAR(30) NOT NULL COMMENT '博客作者',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`views` INT(30) NOT NULL COMMENT '浏览量'
)ENGINE=INNODB DEFAULT CHARSET=utf8
2、If
<select id="getBlog" 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>
3、choose、when、otherwise
<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>
views=#{views}
</otherwise>
</choose>
</where>
</select>
4、trim、where、set
where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句**(里面什么都没有就会删除where)**。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
<select id="getBlogIf" parameterType="map" resultType="Blog">
select * from blog
<where>
<if test="title!=null">
title=#{title}
</if>
<if test="author!=null">
and author=#{author}
</if>
</where>
</select>
set 元素会动态地在行首插入 SET 关键字(set是必然会有set在前面),并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)
<update id="updateBlog" parameterType="map">
update blog
<set>
<if test="title!=null">
title=#{title},
</if>
<if test="author!=null">
author=#{author}
</if>
</set>
where id=#{id}
</update>
5、SQL片段
有时候,我们可能会讲一些功能的部分抽取初老,方便复用!
- 使用SQL标签抽取公共的部分
- 在需要使用的地方使用Include标签引用即可
<sql id="if-title-author">
<if test="title!=null">
title=#{title}
</if>
<if test="author!=null">
and author=#{author}
</if>
</sql>
<select id="getBlogIf" parameterType="map" resultType="Blog">
select * from blog
<where>
<include refid="if-title-author"></include>
</where>
</select>