公司开始将持久层框架替换成了Mybatis-plus,而使用Mybatis-plus时就会遇到一个很诡异的问题,就是你想更新数据库的某个字段为null时,使用以下写法:
LambdaUpdateWrapper<Entity> wrapper = new LambdaUpdateWrapper<>();
wrapper.set(Entity::getField,null);
wrapper.eq(Entity::getId,1);
this.update(wrapper)
你会发现毫无效果,打印出SQL查看,你也会发现根本没有该字段update...set...的记录,这是为什么呢?这是因为Mybatis-plus在更新的时候做了null判断,默认不更新为null的传参字段,但业务如此,我们应该怎么写呢?
方式一:调整全局的验证策略
注入配置 GlobalConfiguration 属性 fieldStrategy
方式二:调整字段验证注解
根据具体情况,在需要更新的字段中调整验证注解,如验证非空:
@TableField(strategy=FieldStrategy.NOT_EMPTY)
方式三:使用 UpdateWrapper (3.x)
使用以下方法来进行更新或插入操作:
mapper.update(
null,
Wrappers.<Entity>lambdaUpdate()
.set(Entity::getField, null)
.eq(Entity::getId, 2)
);
也可以是下面的写法
UpdateWrapper<Entity> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("field", null);
updateWrapper.eq("id", 2)
this.update(updateWrapper);
但是这种写法是会写死实体的字段名称,不易于拓展,不推荐。
这里的话,我比较推荐使用第三种方式,因为他不需要在代码配置改动什么的,只需要在业务代码自定义修改想要修改的实体字段,较为灵活。