1. 5 个选项的作用
1.1 IGNORED 忽略判断,无论字段是 null / 空 / 有值,一律强制写进 SQL
1.2 NOT_NULL 字段 非 null 时才写进 SQL(null 时忽略该字段)
1.3 NOT_EMPTY 字段 非 null 且非空 时才写(对 String 还要求非空串,对 Collection 要求非空,对 Array 要求非空)
1.4 DEFAULT 跟随全局配置(即 mybatis-plus.global-config.db-config.update-strategy/insert-strategy 的值,通常默认是 NOT_NULL)
1.5 NEVER 永远不写该字段(无论什么值都被忽略)
注意:FieldStrategy 在不同位置作用不同:
@TableField(insertStrategy=...) 只影响 INSERT
@TableField(updateStrategy=...) 只影响 UPDATE
@TableField(whereStrategy=...) 只影响 WHERE 条件
不带前缀的 @TableField(strategy=...) 同时影响 insert+update(旧用法,3.1.2+ 推荐用带前缀的)
MyBatis-Plus中insertStrategy全局默认值为NOT_NULL,updateStrategy全局默认值为NOT_NULL,selectStrategy全局默认值为NOT_EMPTY
2.各自典型使用场景
2.1 IGNORED --- 需要"显式覆盖为 null"
场景:你确实想把一个已有值重置/清空为 NULL。例如"取消绑定"用户头像、清空备注字段,业务上允许该列 NULL。
风险:如果列是 NOT NULL(就像你之前 device_status 案例),用 IGNORED 且传了 null 会直接抛 Column ... cannot be null。这正是一开始的报错根因。
2.2 NOT_NULL --- 最常用,只更新有值的字段
场景:部分字段更新(Patch 语义)。前端只传要改的字段,没传的保持数据库原值。例如用户资料编辑,只改昵称时不小心把头像置 null。
这也是 MyBatis-Plus 全局默认值,绝大多数字段都用它。
2.3 NOT_EMPTY --- 比 NOT_NULL 更严格,针对文本/集合
场景:字符串字段不允许被更新成空串 "",或 List 不允许被清成空集合。例如标签列表、备注,业务上"空串/NULL/空集合"都视为无效输入。
注意:NOT_EMPTY 对基本类型(int 等)效果同 NOT_NULL,因为基本类型永远非空。
2.4 DEFAULT --- 交给全局统一策略
场景:某个字段没有特殊需求,希望和项目全局配置保持一致,避免在每个字段上硬编码策略。方便后续统一切换策略(如从 NOT_NULL 切到 NOT_EMPTY)。
2.5 NEVER --- 该字段永远由数据库/其它方式维护
场景:字段由数据库自动生成或永远不该被 ORM 写入。例如:
主键自增 id(配合 @TableId(type = IdType.AUTO) 时通常不需要,但某些只读列可标 NEVER)
创建时间只在 insert 时由 fillStrategy/自动填充处理,update 时绝不允许覆盖
审计字段、版本号等由框架托管