MyBatis 的 标签本质是“智能裁剪+自动拼接”,通过 prefix、prefixOverrides、suffix、suffixOverrides 四属性协同处理 SQL 片段的开头和结尾,用于解决 WHERE 条件多 and/or、SET 子句末尾逗号、INSERT 动态字段与值等问题。

MyBatis 的 `
用 `` 解决 WHERE 条件开头多 and/or 的问题
常见错误是多个 `
- 设置 `prefix="WHERE"`:保证最终 SQL 有合法的 WHERE 关键字
- 设置 `prefixOverrides="and |or"`:只要拼出来的条件片段以 and 或 or 开头(不管大小写、空格多少),就把它干掉
- 每个 `
` 内部写 `and xxx = #{xxx}`,放心写,不用判断是否第一个条件
示例:
用 `` 构建安全的 SET 子句
更新语句中,不能总写满所有字段。`
- `prefix="SET"`:确保开头是 SET
- `suffixOverrides=","`:把拼完后末尾的逗号去掉(比如 `name=?, age=?,` → 去掉最后逗号)
- 每个 `
` 写 `字段=#{值},`,结尾带逗号,由 ` ` 统一收尾
示例:
UPDATE user
WHERE id = #{id}
用 `` 动态拼接 INSERT 字段和值
插入时只插入非空字段,避免写一堆 NULL 或触发默认值失效。这时 `
- 字段部分:`prefix="("`、`suffix=")"`、`suffixOverrides=","` → 拼出 `(name, email)`
- 值部分:同样用 `prefix="values ("`、`suffix=")"`、`suffixOverrides=","` → 拼出 `values (?, ?)`
- 每个 `
` 对应一个字段+一个值,保持顺序一致
示例:
INSERT INTO user
注意几个关键细节
`prefixOverrides` 和 `suffixOverrides` 是“匹配并删除”,不是正则;用 `|` 分隔多个可选字符串,空格会被当作分隔符的一部分,所以写 `and |or` 比 `and|or` 更稳妥;`suffixOverrides` 删除的是整个结尾字符串(如 `,` 或 `and`),不是单个字符;`prefix` 和 `suffix` 总是加在最终裁剪后的结果两端,顺序不可逆。


















