因为当修改的对象的某一属性为null时,mybatis plus默认不会覆盖数据库中的值。官方给出三种处理方式,使用第三种方式,满足我的需求,我的需求:1.不能影响其他业务。2.不知道那些值需要置为null
官方处理方式如下:
FieldStrategy 有三种策略:
- IGNORED:忽略
- NOT_NULL:非 NULL,默认策略
- NOT_EMPTY:非空
当用户有更新字段为 空字符串 或者 null
的需求时,需要对 FieldStrategy
策略进行调整:
-
方式一:调整全局的验证策略
注入配置 GlobalConfiguration 属性 fieldStrategy
-
方式二:调整字段验证注解
根据具体情况,在需要更新的字段中调整验证注解,如验证非空:
@TableField(strategy=FieldStrategy.NOT_EMPTY)
-
方式三:使用
UpdateWrapper
(3.x)使用以下方法来进行更新或插入操作:
//updateAllColumnById(entity) // 全部字段更新: 3.0已经移除 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) );
我的处理方式:
//因mybatis默认不会把null覆盖到数据库,考虑到不能影响到其他业务,把相关数据先全部更新为null,在进行修改数据更新。
mapper.update(null, Wrappers.<Tb>lambdaUpdate()
.set(Tb::gete, null)
.set(Tb::geteName, null)
.set(Tb::geta, null)
.set(Tb::getaName, null)
.set(Tb::getDis, null)
.set(Tb::getDisName, null)
.set(Tb::getLabel, null)
.eq(Tb::getId, updateEntity.getId()));
updateById(updateEntity);