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

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

相关推荐
panxianren1 天前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
sunshine22 girl1 天前
Java学习七 Java 项目实战2-注册业务
java·学习
省钱兄--zs1 天前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
youdexiang1 天前
Android录音软件时间关键词检索功能分析
java·人工智能
sunshine22 girl1 天前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
code2cat1 天前
Java进阶篇之AtomicStampedReference:引用回到原值,版本戳仍能记住变化
java·cas·并发编程·aba
许彰午1 天前
01-Oracle数据库简介与版本选择
数据库·oracle
菜鸟~noob2331 天前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
泡茶喝茶写代码1 天前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据
Seraphina361 天前
SQL注入(二)盲注
网络·数据库·经验分享·笔记·sql