4.3 where、set、trim 标签用法
where 标签
<where>
...if标签或choose标签...
</where>where 标签的作用:
如果该标签包含的元素中有返回值,就插入一个where;
如果where后面的字符串是以AND和OR开头的,就将它们剔除。
使用案例
<select id="findActiveBlogLike" resultType="Blog">
SELECT
*
FROM BLOG
WHERE
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>如果没有匹配的条件会怎么样?最终这条 SQL 会变成这样:
SELECT * FROM BLOG WHERE如果匹配的只是第二个条件又会怎样?这条 SQL 会是这样:
SELECT * FROM BLOG WHERE AND title like 'someTitle'
添加where标签后可以轻易地解决上述问题:
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。
而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
set 标签
set 标签的作用:
如果该标签包含的元素中有返回值,就插入一个set;
如果set后面的字符串是以逗号结尾的,就将这个逗号剔除。
set 标签主要用在update语句中,作用和where标签类似,可以参考where标签的使用案例。
trim 标签
where 和 set 标签的功能都可以用trim 标签来实现,并且在底层就是通过TrimSqlNode实现的。
trim标签有如下属性:
prefix:当trim元素内包含内容时,会给内容增加prefix指定的前缀。
prefixOverrides:当trim元素内包含内容时,会把内容中匹配的前缀字符串去掉。
suffix:当trim元素内包含内容时,会给内容增加suffix指定的后缀。
suffixOverrides:当trim元素内包含内容时,会把内容中匹配的后缀字符串去掉。
where 标签对应的trim 的实现如下:
为了避免匹配到andes、orders等单词,这里的AND和OR后面的空格不能省略。实际的prefixeOverrides包含“AND”、“OR”、“AND\n”、“OR\n”、“AND\r”、“OR\r”、“AND\t”、“OR\t”,不仅仅是上面提到的两个带空格的前缀。
set 标签对应的trim 实现如下:
Last updated