MyBatis的<trim>标签核心作用是智能拼接SQL并自动清理冗余字符,通过prefix/suffix添加固定前后缀,用prefixOverrides/suffixOverrides去除开头或结尾多余关键字或符号。
` 怎么自定义前缀和后缀修饰">
MyBatis 的 <trim> 标签核心作用是“智能拼接 + 自动清理”,不是简单加前后缀,而是在拼完一整段 SQL 后,再统一处理开头和结尾的冗余字符。它常用于替代 <where> 和 <set>,灵活性更高。
怎么用 prefix 和 suffix 加上固定前缀/后缀
这两个属性直接作用于整个 <trim> 标签内部拼出来的完整 SQL 片段:
-
prefix="WHERE"→ 拼完所有<if>后,整个结果前加WHERE -
suffix="ORDER BY id DESC"→ 整个结果后加ORDER BY id DESC - 如果内部没生成任何内容(比如所有条件都为 false),
prefix和suffix默认仍会加上 —— 这时就需要prefixOverrides或suffixOverrides配合控制
怎么用 prefixOverrides 去掉开头多余的关键字
它匹配的是拼出的 SQL 片段最开头的**连续字符串**,支持空格分隔的多个候选值(用 | 分隔):
-
prefixOverrides="AND | OR | WHERE":若拼出的是AND name = ? AND age = ?,开头的AND(含空格)会被删掉,变成name = ? AND age = ? - 注意写法:
AND后面带空格,因为 MyBatis 匹配的是字面量;WHERE单独写没问题,但WHERE更稳妥 - 常见组合:
prefix="WHERE" prefixOverrides="AND | OR",这样既加了WHERE,又避免出现WHERE AND ...
怎么用 suffixOverrides 去掉结尾多余的符号
它从拼出的 SQL 片段末尾开始,删除指定的**后缀字符串**(也是字面量匹配):
立即学习“Java免费学习笔记(深入)”;
-
suffixOverrides=",":适用于SET name=?, age=?,这类场景,自动抹掉最后的逗号 -
suffixOverrides=" OR "(注意空格):可清理末尾残留的OR - 典型用法:
<trim suffix=")" suffixOverrides=","><if test="a!=null">id,</if><if test="b!=null">name,</if></trim>→ 输出(id,name)
实际组合示例:动态 UPDATE 语句
下面这段 XML 实现安全更新,自动跳过 null 字段,且不产生语法错误:
<update id="updateUser" parameterType="User">
UPDATE user
<trim prefix="SET" suffixOverrides=",">
<if test="username != null">username = #{username},</if>
<if test="email != null">email = #{email},</if>
<if test="status != null">status = #{status},</if>
</trim>
WHERE id = #{id}
</update>
效果:
- 只填
username→ 生成SET username = ?(逗号被删) - 三个字段都填 → 生成
SET username = ?, email = ?, status = ?(末尾逗号被删) - 全为空 →
SET不会出现(因为<trim>内部无内容时,prefix不生效)


















