Mybatis-Plus使用 updateById或updateBatchById 更新字段为null 不更新问题


问题:

最近一次在写个需求的时候,需要更新数据库字段,使用了Mybatis-Plus中的updateById方法,发现当前端传过来是Null值的时候,出现updateByID方法无法将字段值更新为null的问题,经验证,updateBatchById方法同样无法更新null值。

在控制台打印sql语句时,发现mybatis-plus对为null的字段进行了过滤。

查阅资料后发现,3.1.2版本后,field-strategy被弃用,db-config配置项field-strategy=ignore失效,在使用updateByID方法时,mybatis-plus采用默认策略,忽略对null的校验,即""会更新,null不会更新,导致无法更新null。

解决方法

在需要字段上加上@TableField(strategy = FieldStrategy.IGNORED)注解,就会忽略为空的判断,将该字段设置为null也会更新表中的数据

拓展

新版本采用如下三个注解来进行配置

insertStrategy

类型:

com.baomidou.mybatisplus.annotation.FieldStrategy

默认值:

NOT_NULL

updateStrategy

类型:

com.baomidou.mybatisplus.annotation.FieldStrategy

默认值:

NOT_NULL

selectStrategy

类型:

com.baomidou.mybatisplus.annotation.FieldStrategy

默认值:

NOT_NULL

意义如下:

IGNORED,忽忽略非空判断,null和""都不过滤

DEFAULT, 默认

NOT_EMPTY, 非空判断,为null,为空串的忽略,就是如果设置值为null,"",不会更新数据库

NOT_NULL, 非NULL判断,忽略null的字段,不忽略""

为了更新null,有如下几种方式:

a、全局配置,所用更新都不过滤null和""

1 db-config:
2     update-strategy: ignored

b、单字段配置,对该字段更新时不过滤null和""

1 TableField(updateStrategy = FieldStrategy.IGNORED)
2 private String imgUrl;


c、自定义

1 this.lambdaUpdate()
2     .eq(User::getId, User.getId())
3     .set(User::getName, stageInfo.getName())
4     .update();