MyBatis-Plus 3.x FieldStrategy 作用

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 时绝不允许覆盖

审计字段、版本号等由框架托管

相关推荐
lhldsg1 小时前
课程排课系统实战指南:从数据库设计到算法调优全流程解析
java·数据库·算法·小程序
光电的一只菜鸡1 小时前
高通tuning中eis需要调什么
java·开发语言·前端
丰锋ff1 小时前
数据库操作的一些相关命令
数据库
往事只能回味味道1 小时前
MySQL创建数据库并授权指导用户与IP
数据库·tcp/ip·mysql
BUG研究员_2 小时前
LangChain 向量数据库实战:Redis 与 Pinecone 的知识点总结
数据库·redis·langchain
API快乐传递者2 小时前
1688 跨境电商 API 接口实战指南:从寻源到代采的全链路技术方案
java·前端·数据库
孔明click332 小时前
不想写代码,但想要集成一个登录页面?Sa-Token-Quick-Login 帮你实现!
java·sa-token·开源·springboot·登录·权限·权限认证
曹牧2 小时前
C#与Java后台交互
java·windows·microsoft·c#
张晓祥-长草颜团子2 小时前
【重庆两江新区歌词】
java