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 值导致的意外数据问题,提高代码健壮性。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐