MyBatis-Plus 实战:更新对象时如何将字段值更新为 null

一、问题背景

在使用 MyBatis-Plus 进行更新操作时,我们常常会写出如下代码:

User user = new User();
user.setId(1L);
user.setEmail(null);
userService.updateById(user);

本意是希望将用户 ID 为 1 的那条记录的 email 字段更新为 NULL
但执行后发现 —— 数据库中的 email 并没有被置空

很多开发者第一次遇到这个问题都会疑惑:

“明明 set 了 null,为什么没更新?”

要理解这个行为,我们先得了解 MyBatis-Plus 的默认更新策略。


二、默认行为:忽略 null 字段

MyBatis-Plus 默认在执行 updateById()update() 时,会忽略掉值为 null 的字段

这是由其内置的 字段更新策略(FieldStrategy) 决定的。

默认配置如下:

mybatis-plus:
  global-config:
    db-config:
      update-strategy: not_null

含义:

仅当字段的值 不为 null 时,才会出现在 SQL 的 SET 子句中。

举例说明:

User user = new User();
user.setId(1L);
user.setEmail(null);
user.setNickname("Tom");
userService.updateById(user);

生成的 SQL 大致如下:

UPDATE user SET nickname = 'Tom' WHERE id = 1;

而不会包含 email = NULL


三、解决方案:让 null 也能更新

想要让字段被更新为 null,有几种方式👇


✅ 方式一:全局修改更新策略

application.yml 中添加以下配置:

mybatis-plus:
  global-config:
    db-config:
      update-strategy: always

always 表示:无论字段值是否为 null,均参与更新。

示例:

User user = new User();
user.setId(1L);
user.setEmail(null);
userService.updateById(user);

生成 SQL:

UPDATE user SET email = NULL WHERE id = 1;

适合场景:

全局业务逻辑都允许将字段更新为 null。







次阅读

扫描下方二维码,关注公众号:程序进阶之路,实时获取更多优质文章推送。


扫码关注

评论