MyBatis动态SQL中if,where,set,trim四种标签的使用和联系
2023-12-23 18:25:08
目录
MyBatis动态SQL中if,where,set,trim四种标签的使用和联系
1、先介绍trim标签
mybatis的trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。
以下是trim标签中涉及到的属性:
2、使用trim标签或where标签去除多余的and关键字
<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标签来解决这个问题,where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,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>
trim标签也可以完成相同的功能,写法如下:
<trim prefix="WHERE" prefixOverrides="AND">
<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>
</trim>
3、使用trim标签或set标签去除多余的逗号
<insert id="insertRoleSelective" parameterType="mtdp.po.Role" useGeneratedKeys="true" keyProperty="id">
INSERT INTO role
(
<if test="roleName != null">
role_name,
</if>
<if test="note != nulL">
note
</if>
)
VALUES(
<if test="roleName != null">
</if>
<if test="note != null">
</if>
)
</insert>
如果第二个if里面的条件没有匹配上,sql语句会变成如下:
INSERT INTO role(role_name,) VALUES(roleName,)
插入将会失败。
使用set标签则和上面的where标签一样包裹if标签即可去掉sql语句最后的逗号;
使用trim标签可以解决此问题,只需做少量的修改,如下所示:
其中最重要的属性是:
suffixOverrides=","
文章来源:https://blog.csdn.net/qq_62124267/article/details/135166658
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!