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();