mybatisPlus FieldStrategy 策略作用
方案 3(细粒度控制)→ 方案 2(全局配置)→ 方案 1(临时需求)→ 方案 4(特殊场景)。的问题,这是因为 MyBatis-Plus 默认会忽略。:在 Mapper 接口中自定义更新方法,使用。让 MyBatis-Plus 不忽略。针对 MyBatis-Plus 的。:在实体类字段上指定更新策略为。方法无法将字段更新为。
·
MyBatis-Plus 的 FieldStrategy 枚举用于控制实体字段在 插入(Insert)、更新(Update) 和 查询条件(Where) 中的空值处理策略。理解这些策略对避免数据异常非常重要,以下是详细解释:
一、各策略的作用
1. IGNORED
- 作用:忽略空值判断,无论字段值是否为
null、空字符串("") 或空集合,都会参与 SQL 操作。 - 场景:强制将字段更新为
null(解决saveOrUpdate无法更新null的问题)。
2. NOT_NULL
- 作用:仅忽略
null值,非null的空字符串或空集合仍会参与 SQL 操作。 - 场景:允许字段为空字符串,但不允许
null(如数据库字段允许''但不允许NULL)。
3. NOT_EMPTY
- 作用:忽略
null、空字符串("") 和空集合。 - 场景:字符串或集合类型字段必须有实际值(如用户名、列表数据)。
4. DEFAULT
- 作用:全局默认策略,通常等价于
NOT_NULL(取决于 MyBatis-Plus 版本)。 - 场景:使用全局配置的默认行为。
5. NEVER
- 作用:永远不参与 SQL 操作,无论值是什么。
- 场景:字段仅用于业务逻辑,不与数据库交互(如临时计算字段)。
二、不同方法(insert/update/where)的策略差异
1. insertStrategy(插入时)
- 影响范围:
save()、saveBatch()等插入方法。 - 示例:
@TableField(insertStrategy = FieldStrategy.NOT_NULL) private String username; // 插入时忽略 null 值
2. updateStrategy(更新时)
- 影响范围:
updateById()、saveOrUpdate()、update(entity, wrapper)等更新方法。 - 示例:
@TableField(updateStrategy = FieldStrategy.IGNORED) private String email; // 更新时允许将 email 设置为 null
3. whereStrategy(查询条件时)
- 影响范围:
Wrapper条件构造器中的实体参数。 - 示例:
@TableField(whereStrategy = FieldStrategy.NOT_EMPTY) private String phone; // 查询条件中忽略空字符串和 null
三、策略对比表
| 策略 | 插入(Insert) | 更新(Update) | 查询条件(Where) |
|---|---|---|---|
IGNORED |
字段值无论如何都插入 | 字段值无论如何都更新 | 字段值无论如何都作为条件 |
NOT_NULL |
忽略 null,插入其他值 |
忽略 null,更新其他值 |
忽略 null,其他值作为条件 |
NOT_EMPTY |
忽略 null、""、空集合 |
忽略 null、""、空集合 |
忽略 null、""、空集合 |
DEFAULT |
按全局配置(通常为 NOT_NULL) |
按全局配置(通常为 NOT_NULL) |
按全局配置(通常为 NOT_NULL) |
NEVER |
字段不参与插入 | 字段不参与更新 | 字段不作为条件 |
四、常见应用场景
1. 允许更新字段为 null
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String remark; // 允许将备注更新为 null
2. 插入时自动填充默认值
@TableField(insertStrategy = FieldStrategy.NOT_NULL)
private Integer status = 1; // 插入时若未设置值,则使用默认值 1
3. 避免空字符串作为查询条件
@TableField(whereStrategy = FieldStrategy.NOT_EMPTY)
private String keyword; // 避免空字符串作为查询条件
五、全局配置 vs 字段注解
-
全局配置(优先级低):
mybatis-plus: global-config: db-config: insert-strategy: NOT_NULL update-strategy: NOT_NULL where-strategy: NOT_EMPTY -
字段注解(优先级高):
@TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.NOT_NULL) private String nickname;
六、总结
IGNORED:强制让null参与 SQL 操作,解决saveOrUpdate无法更新null的问题。NOT_NULL:最常用,避免null导致数据库字段被意外覆盖。NOT_EMPTY:适合字符串和集合类型,确保有实际数据。- 更新
null字段:优先使用FieldStrategy.IGNORED注解,而非全局配置。
合理配置这些策略可以避免 null 值导致的意外数据问题,提高代码健壮性。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)