mybatis-plus 默认支持自动跳过 null 字段更新,updatebyid 和 update 方法均按 fieldstrategy.not_null 策略只更新非 null 值;若全局配置为 ignored 会导致 null 被写入,需改为 not_null 或留空;可通过 @tablefield 指定字段级策略,或用 lambdaupdatewrapper 精准控制更新字段。

MyBatis 本身不自带“自动跳过 null 字段”的能力,但 MyBatis-Plus 默认就支持只更新非空字段——只要没额外配置或误用方式,updateById 就不会把 null 值写进数据库。
确认你用的是 MyBatis-Plus
原生 MyBatis 需要手写动态 SQL(比如用 <if test="xxx != null"></if>)才能实现;而 MyBatis-Plus 在多数场景下开箱即用:
-
this.updateById(entity):默认只更新实体中非null的字段(FieldStrategy.NOT_NULL) -
this.update(entity, wrapper):同样跳过null值,除非 wrapper 显式设了.set("col", null)
检查是否被全局策略覆盖
如果你发现 null 字段仍被清空,很可能是全局配置改成了 IGNORED 或 NOT_EMPTY:
- yml 中检查是否有:
mybatis-plus.global-config.db-config.update-strategy=ignored - 若存在,删掉或改为
not_null(推荐)或留空(默认即为NOT_NULL)
按字段精细控制更新行为
某些字段需要特殊处理(比如允许更新为 null,或字符串要同时判空串):
- 加注解:
@TableField(updateStrategy = FieldStrategy.NOT_NULL)→ 非 null 才更新 - 字符串字段更严格:
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)→ 非 null 且非空串才更新 - 个别字段需强制更新(含 null):
@TableField(updateStrategy = FieldStrategy.IGNORED)
用 Wrapper 精准指定要改的字段
当只改几个字段、且可能为 null 时,比传整个实体更安全:
LambdaUpdateWrapper<user> w = new LambdaUpdateWrapper().eq(User::getId, id).set(User::getName, newName).set(User::getAge, newAge); update(w);</user>- 这样写,哪怕
newAge == null,也不会触发 age 字段更新(Wrapper 内部会跳过 null 值)











