Mybatis-plus置字段为空的正确写法


    公司开始将持久层框架替换成了Mybatis-plus,而使用Mybatis-plus时就会遇到一个很诡异的问题,就是你想更新数据库的某个字段为null时,使用以下写法:

LambdaUpdateWrapper 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.lambdaUpdate()
       .set(Entity::getField, null)
       .eq(Entity::getId, 2)
);

也可以是下面的写法

UpdateWrapper updateWrapper = new UpdateWrapper<>();
updateWrapper.set("field", null);
updateWrapper.eq("id", 2)
this.update(updateWrapper);

但是这种写法是会写死实体的字段名称,不易于拓展,不推荐。

这里的话,我比较推荐使用第三种方式,因为他不需要在代码配置改动什么的,只需要在业务代码自定义修改想要修改的实体字段,较为灵活。

你可能感兴趣的:(Mybatis-plus置字段为空的正确写法)