在 MyBatis-Plus 中,@TableField 注解的 updateStrategy 属性是控制字段更新行为的核心配置之一。合理使用它可以避免脏数据、优化 SQL 性能,甚至解决一些隐蔽的业务问题。本文将详细解析 updateStrategy 的所有策略类型、配置方法及注意事项,助你精准掌握数据更新逻辑!
一、@TableField(updateStrategy) 的 4 种配置类型
updateStrategy 支持以下四种策略,通过 FieldStrategy 枚举定义:
策略类型 | 行为描述 | 适用场景 |
---|---|---|
FieldStrategy.IGNORED | 忽略判空逻辑,无论字段值是否为 null 或空字符串,均会更新到数据库。 | 需强制覆盖数据库字段(如重置字段为 null) |
FieldStrategy.NOT_NULL | 仅当字段值不为 null 时更新,null 值会被忽略。 | 大多数业务场景,默认策略 |
FieldStrategy.NOT_EMPTY | 字段值不为 null 且不为空字符串时更新(如 "" 也会被忽略)。 | 需排除空字符串的场景(如用户名、地址) |
FieldStrategy.DEFAULT | 使用全局配置(参考 application.yml 中的 field-strategy)。 | 统一管理所有字段的更新策略 |
二、配置方法示例
1. 注解方式(推荐)
kotlin
java
public class User {
// 忽略判空,强制更新(即使值为 null)
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String forceUpdateField;
// 非 null 才更新(默认策略)
@TableField(updateStrategy = FieldStrategy.NOT_NULL)
private Integer age;
// 非空(null 或 "")才更新
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private String username;
}
2. 全局配置
在 application.yml 中统一设置:
yaml
yaml
mybatis-plus:
global-config:
db-config:
field-strategy: not_empty # 全局默认策略为非空
三、注意事项与常见误区
1. IGNORED 的陷阱:慎用强制更新
问题:使用 IGNORED 时,若实体字段为 null,生成的 SQL 会直接更新为 NULL,可能覆盖数据库原有值! 建议:仅在需要覆盖数据库默认值(如重置密码为 null)时使用,且确保数据库字段允许 NULL。
2. NOT_EMPTY 与空字符串
- 注意: 空字符串 "" 会被视为无效值,不会触发更新。若业务中允许空字符串(如状态码),需改用 NOT_NULL。
- 示例: 用户表中的 email 字段若允许空字符串,应配置为 NOT_NULL,否则 NOT_EMPTY 会导致无法更新。
动态更新时的覆盖问题
- 现象: 即使字段策略为 NOT_NULL,通过 UpdateWrapper 的 set 方法仍可强制更新 null。
- 代码示例:
sql
java
// 强制更新 username 为 null(即使策略是 NOT_NULL)
userMapper.update(null, new LambdaUpdateWrapper<User>()
.set(User::getUsername, null)
.eq(User::getId, 1));
- 解决: 避免直接操作 set,或通过业务逻辑校验。
全局配置与局部覆盖
- 优先级: 字段注解的配置优先级高于全局配置。例如,全局设置为 NOT_EMPTY,但某字段显式配置为 NOT_NULL,则以字段注解为准。
- 建议: 全局配置适合统一管理默认行为,但关键字段建议单独配置。
数据库约束与业务逻辑的一致性
- 风险: 若数据库字段为 NOT NULL,但代码中配置了 NOT_EMPTY,当传入空字符串时可能导致更新失败。
- 建议: 保持数据库约束与代码策略一致,例如:数据库字段允许 NULL 时再使用 NOT_EMPTY。
四、总结:如何选择策略?
场景 | 推荐策略 |
---|---|
默认情况(大多数字段) | FieldStrategy.NOT_NULL |
需排除空字符串(如用户名) | FieldStrategy.NOT_EMPTY |
强制覆盖字段(如重置状态) | FieldStrategy.IGNORED |
统一管理所有字段策略 | 全局配置 + 局部覆盖 |
微信公众号:【码农小站】 原文链接:blog.mnxz.fun/index.html?...