Mybatis plus更新字段值为null

发布时间 2023-09-12 10:36:55作者: 種瓜得豆

使用Mybatis-plus操作数据库时,如果未自己写sql而是采用Mybatis-plus的方法设置sql的情况下,默认Mybatis-plus生成sql时会将设置为null的字段忽略掉(不更新该字段);

解决方法:

1、自己写sql

在mapper.xml中写对应的sql语句(insert语句/update语句/where条件中设置对应字段的值为null即可)

2、调整字段验证注解

mybatis-plus 默认的更新策略FieldStrategy 有三种策略

IGNORED:忽略。不管有没有有设置属性,所有的字段都会设置到insert语句中,如果没设置值会更新为null;
NOT_NULL:非 NULL,默认策略。也就是忽略null的字段,不忽略"";
NOT_EMPTY:非空。为null,为空串的忽略,就是如果设置值为null,"",不会插入数据库;

默认的是NOT_NULL,也就是忽略null字段,所以更新不成功。

根据具体情况,在需要更新的字段中调整验证注解,如验证非空:

@TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED)
private LocalDate birthday;

【问题】如果有些地方的操作,忘记设置该字段的值因为这个注解的原因,那么可能就会导致更新后,该字段的值为null。

3、使用Mybatis-plus 3.x版本提供的新方法【推荐】

UpdateWrapper<TestEntity> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("name",null);
updateWrapper.eq("id",id);
testService.update(updateWrapper);
// update(entity, updateWrapper)
mapper.update(
  new User().setName("mp").setAge(3),
  Wrappers.<User>lambdaUpdate()
          .set(User::getEmail, null) //把email设置成null
          .eq(User::getId, 2)
);
mapper.update(
   null,
   Wrappers.<User>lambdaUpdate()
      .set(User::getAge, 3)
      .set(User::getName, "mp")
      .set(User::getEmail, null) // 把email设置成null
      .eq(User::getId, 2)
);