格式化输出:
mybatis的trim标签一般用于动态SQL中,去除SQL语句中多余的and关键字,逗号,或者给SQL语句前拼接 “where“、“set“以及values, “(” 前缀,“)“ 后缀等,可用于选择性插入、更新、删除或者条件查询等操作,。
以下是trim标签中涉及到的属性:
一、trim where - 去除多余关键字and、or
例:
<select id="insertSelective" resultType="BaseResultMap">
SELECT *
FROM wechat_qa
WHERE
<if test="id != null">
id = #{id}
</if>
<if test="name != null">
AND name like #{name}
</if>
<if test="age != null">
AND age =#{age}
</if>
</select>
如果这些条件一个都没有匹配,这条SQL会变成这样:
SELECT * FROM wechat_qa
WHERE
这会导致查询失败。如果只第二个条件匹配呢?这条SQL会变成这样:
SELECT * FROM wechat_qa
WHERE
AND name like ‘someName’
可以使用where标签来解决这个问题,where 元素只会在至少有一个子元素的条件返回SQL子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,where 元素也会将它们去除。
例:
<select id="insertSelective" resultType="BaseResultMap">
SELECT *
FROM wechat_qa
<WHERE >
<if test="id != null">
id = #{id}
</if>
<if test="name != null">
AND name like #{name}
</if>
<if test="age != null">
AND age =#{age}
</if>
</WHERE>
</select>
用trim标签也可以完成相同的功能:
<select id="insertSelective" resultType="BaseResultMap">
SELECT *
FROM wechat_qa
<trim prefix="WHERE" prefixOverrides="AND" >
<if test="id != null">
id = #{id}
</if>
<if test="name != null">
AND name like #{name}
</if>
<if test="age != null">
AND age =#{age}
</if>
</trim>
</select>
二、trim set - 去除多余的逗号
类似的用于动态更新语句的解决方案叫做 set。set 元素可以被用于动态包含需要更新的列,而舍去其他的。
例:
<update id="updateUser">
update wechat_qa
set
<if test="name != null">
name=#{name},
</if>
<if test="age != null">
age=#{age}
</if>
where id=#{id}
</update>
如果<if test="name != null">name=#{name},</if>没有匹配上,SQL语句就会变成如下这样,更新会失败:
update wechat_qa set name=name, where id=id
使用set标签可以解决这个问题,用于动态包含需要更新的列,而舍去其他的,set会动态前置 SET 关键字,同时也会消除无关的逗号:
<update id="updateUser">
update wechat_qa
<set>
<if test="name != null">name=#{name},</if>
<if test="age != null">age=#{age}</if>
</set>
where id=#{id}
</update>
用trim标签也可以完成相同的功能:
<trim prefix="SET" suffixOverrides=",">
...
</trim>
同样的,插入数据:
<insert id="insertUser" resultType="BaseResultMap">
insert into wechat_qa (
<if test="id != null">
id,
</if>
<if test="name != null">
name,
</if>
<if test="age != null">
age
</if>
)
values (
<if test="id != null">
#{id},
</if>
<if test="name != null">
#{name},
</if>
<if test="age != null">
#{age}
</if>
)
</insert>
如果<if test="age != null">age</if>条件没有匹配上,SQL语句就会变成如下这样,插入会报错:
INSERT INTO wechat_qa(id,name,) VALUES(id,name,)
用trim标签可以解决这个问题:
<insert id="insertUser" resultType="BaseResultMap">
insert into wechat_qa
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="name != null">
name,
</if>
<if test="age != null">
age
</if>
</trim>
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id},
</if>
<if test="name != null">
#{name},
</if>
<if test="age != null">
#{age}
</if>
</trim>
</insert>
网友评论