trim 自定义裁剪
<trim> 是 MyBatis 中最灵活的动态 SQL 标签,可自定义添加或移除 SQL 前缀/后缀,适用于 where、set、order by 等复杂场景。
核心属性
<trim> 提供四个核心属性,组合使用可实现精确裁剪:
| 属性 | 作用 | 示例值 |
|---|---|---|
| prefix | 当 trim 内部有内容时,整体添加前缀 | WHERE、SET、( |
| suffix | 当 trim 内部有内容时,整体添加后缀 | )、; |
| prefixOverrides | 移除内容开头的指定字符(忽略大小写) | AND | OR |
| suffixOverrides | 移除内容结尾的指定字符 | ,、; |
基本用法
模拟 WHERE 条件拼接:
XML
<select id="findUser" resultType="User">
SELECT * FROM user
<trim prefix="WHERE" prefixOverrides="AND | OR">
<if test="name != null">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="age != null">
AND age = #{age}
</if>
</trim>
</select>
当 name=null, age=25 时,AND age = 25 开头的 AND 被移除,整体添加 WHERE 前缀:
SQL
SELECT * FROM user WHERE age = 25
模拟 SET 更新
XML
<update id="updateUser">
UPDATE user
<trim prefix="SET" suffixOverrides=",">
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</trim>
WHERE id = #{id}
</update>
当两个条件都满足时,末尾逗号被移除:
SQL
UPDATE user SET name = ?, age = ? WHERE id = ?
复杂裁剪场景
多表 JOIN 动态排序:
XML
<select id="findOrders" resultType="Order">
SELECT o.id, o.amount, u.name
FROM orders o
JOIN user u ON o.user_id = u.id
<trim prefix="WHERE" prefixOverrides="AND | OR">
<if test="status != null">AND o.status = #{status}</if>
<if test="minAmount != null">AND o.amount >= #{minAmount}</if>
</trim>
<trim prefix="ORDER BY" prefixOverrides="ORDER BY">
<if test="sortBy == 'amount'">o.amount</if>
<if test="sortBy == 'date'">o.create_time</if>
</trim>
<trim prefix="LIMIT" prefixOverrides="LIMIT">
#{offset}, #{limit}
</trim>
</select>
批量 INSERT 拼接:
XML
<insert id="batchInsert">
INSERT INTO user (name, age, email)
<trim prefix="VALUES" suffixOverrides=",">
<foreach collection="list" item="u">
(#{u.name}, #{u.age}, #{u.email}),
</foreach>
</trim>
</insert>
与 where/set 的关系
<where> 和 <set> 本质上是 <trim> 的快捷方式:
| 快捷标签 | 等效 trim 配置 |
|---|---|
<where> | <trim prefix="WHERE" prefixOverrides="AND | OR"> |
<set> | <trim prefix="SET" suffixOverrides=","> |
当 where/set 无法满足裁剪需求时(如自定义后缀、多重前缀),直接使用 trim。
注意事项
prefixOverrides/suffixOverrides支持正则,多值用|分隔,两侧需加空格:AND | OR- 属性值区分大小写,SQL 关键字建议大写
- trim 内部全为空时,prefix/suffix 不会添加
- 嵌套 trim 时需仔细验证最终 SQL,避免重复裁剪
要点总结
- trim 通过 prefix/suffix 添加前后缀,通过 prefixOverrides/suffixOverrides 移除多余字符
- where 和 set 是 trim 的简化封装,复杂场景直接用 trim
- 四个属性可自由组合,支持批量 INSERT、动态 ORDER BY、多表 JOIN 等场景
- prefixOverrides 多值用
|分隔,注意空格和大小写
📝 发现内容有误?点击此处直接编辑