if
choose (when, otherwise)
trim (where, set)
foreach
搭建环境
CREATE TABLE `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
创建一个基础工程
1.导包
2.编写配置文件
3.编写实体类
@Data
public class Blog {
private int id;
private String title;
private String author;
private Date createTime;
private int views;
}
4.编写实体类对应的Mapper接口和Mapper.xml文件
IF语句:
<select id="queryBlog" 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>
Choose(when,otherwise)语句:
<select id="queryBlog" resultType="blog">
select * from blog
<where>
<choose>
<when test="title!=null">
title = #{title}
</when>
<when test="author!=null">
author=#{author}
</when>
<otherwise>
views = #{views}
</otherwise>
</choose>
</where>
</select>
trim(where,set)语句:
<select id="queryBlog" resultType="blog">
select * from blog
<where>
<if test="title!=null">
title = #{title}
</if>
<if test="author!=null">
and author = #{author}
</if>
</where>
</select>
<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>
所谓的动态SQL,本质还是SQL语句,只是我们可以在SQL层面,去执行一个逻辑代码
SQL片段:
有的时候,我们可能会将一些功能的部分抽取出来,方便复用
1.使用SQL标签抽取公共部分
<sql id="if-set">
<if test="title!=null">
title = #{title},
</if>
<if test="author!=null">
author = #{author}
</if>
</sql>
2.在需要使用的地方使用include标签引用即可
<update id="updateBlog" parameterType="map">
update blog
<set>
<include refid="if-set"></include>
</set>
where id = #{id}
</update>
注意事项:
最好基于单表来定义SQL片段
不要存在where标签
ForEach:
<select id="queryBlogForeach" resultType="Blog">
select * from blog
<where>
<foreach collection="ids" item="id1" open="and (" separator="or" close=")">
id = #{id1}
</foreach>
</where>
</select>
动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式去排列组合即可
建议:
现在MySQL中写出完整的SQL 再对应的去修改成为动态SQL实现通用即可