全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-20 6 分钟 ✍️ juanwangdev

trim 自定义裁剪

<trim> 是 MyBatis 中最灵活的动态 SQL 标签,可自定义添加或移除 SQL 前缀/后缀,适用于 where、set、order by 等复杂场景。

核心属性

<trim> 提供四个核心属性,组合使用可实现精确裁剪:

属性作用示例值
prefix当 trim 内部有内容时,整体添加前缀WHERESET(
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 &gt;= #{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 多值用 | 分隔,注意空格和大小写

📝 发现内容有误?点击此处直接编辑

← 上一篇 sql 片段复用
下一篇 → where 智能条件
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库