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

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

相关推荐
卓豪终端管理3 分钟前
【无标题】
java·服务器·前端
智_永无止境10 分钟前
又找到一个纯Java的OCR项目,识别的格式还挺多
java·开发语言·ocr
代钦塔拉12 分钟前
【C++/Qt 进阶】设计模式系列(7):过滤器模式——把“筛选条件“变成可组合的积木
数据库·系统架构
学编程就要猛15 分钟前
MCP(Model Context Protocol)
java·springai
用户0723670666025 分钟前
Apollo 配置热更新落地:让 Spring Boot @ConfigurationProperties Bean 不重启即时生效
java
TDengine (老段)25 分钟前
TDengine IDMP 十大亮点功能(一)
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
为思念酝酿的痛26 分钟前
MySQL的基本查询
数据库·mysql
花间相见30 分钟前
【计算基础|Redis01】【上手】安装连接、配置与通用命令
数据库·后端·面试
2601_9707038331 分钟前
中国除湿机与湿度控制行业研究报告
java·大数据·人工智能