今天学习了动态SQL,回顾一下
动态SQL就是在SQL层面执行逻辑代码
1、 if
最常见情景是根据条件包含 where 子句的一部分;
test=" " 里的是判断条件;
where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除,这一特性让我们再也不用写where 1=1 了 QAQ。
<select id="getBlogByIF" 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>
2、choose (when, otherwise)
choose就相当于我们以前用的switch语句,只选取第一个符合的条件执行;
如果第一个when条件成立,则后面的when就会失效;
ortherwise 就是备选方案,可以为空。
<select id="getBlogByChoose" resultType="Blog">
select * from blog
<where>
<choose>
<when test="id != null">
id = #{id}
</when>
<when test="title != null">
and title = #{title}
</when>
<otherwise>
</otherwise>
</choose>
</where>
</select>
3、trim (where, set)
set 元素大多用于update语句,可以动态包含需要更新的列,忽略其它不更新的列;
set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的);
<update id="updateBlogBySet" parameterType="map">
update blog
<set>
<if test="title != null">
title = #{title},
</if>
<if test="author">
author = #{author},
</if>
</set>
where id = #{id}
</update>
其实 set 元素和where元素都是通过trim元素来实现对应的功能的
我们也可以通过自定义 trim 元素来定制 where 元素的功能
与where 元素等价的自定义 trim 元素为:
//prefixOverrides 属性会忽略通过管道符分隔的文本序列(注意此例中的空格是必要的)
//会移除所有 prefixOverrides 属性中指定的内容,
//并且插入 prefix 属性中指定的内容
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
与 set 元素等价的自定义 trim 元素为:
<trim prefix="SET" suffixOverrides=",">
...
</trim>
我觉得吧,新手会用where和set就够了(个人愚见),后面需要时再回来回顾trim吧 QAQ
4、foreach
动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)
foreach提供给我们遍历集合的功能,提取集合中的元素插入到sql语句中
foreach一共有6个参数
clooection :需要遍历的集合
open :开头字符串
close :结尾字符串
separator : 分隔符
item : 集合中的元素
index : 当使用 Map 对象(或者 Map.Entry 对象的集合)时,item对应的键
<select id="getBlogByForeach" resultType="Blog">
select * from blog
<where>
<foreach collection="ids" open="and (" close=")" separator="or" item="id">
id = #{id}
</foreach>
</where>
</select>
还有一个就是关于代码的复用
sql标签可以实现代码的复用
<sql id="ifTest">
<if test="title != null">
title = #{title}
</if>
<if test="author != null">
and author = #{author}
</if>
</sql>
在需要使用这段代码的地方加上incude即可引用
<select id="getBlogByIF" parameterType="map" resultType="Blog">
select * from blog
<where>
<include refid="ifTest"></include>
</where>
</select>