Mybatis-plus 更新 Null 的策略踩坑记

一个bug

在一个管理页面,有一个非必填字段被设置成空了并提交更新,再次打开的时候,发现字段还在,并没有被更新成功。

使用的数据库映射框架是 Mybatis-plus ,对于Mybatis 在更新字段的时候会对空进行校验,如果字段为 null,会被忽略加入 sql。

应对策略

推荐策略:使用 UpdateWrapper (3.x)

使用 UpdateWrapper 或 LambdaUpdateWrapper

这是官方给出的案例

less 复制代码
//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)
);

通过这种方式,可以达到将字段设置成 null 的效果。

其他策略(不推荐并且慎用)

在字段上增加了 @TableField(updateStrategy = FieldStrategy.IGNORED)

在 DO 字段上添加这个更新策略,就是不会判断 null,任何时候都加入 sql

特别注意:这个策略,在高级版本中已经被 deprecated (3.5.3.2)

更新丢失风险 FieldStrategy.ALWAYS

意味着在每次更新操作中,都会将实体对象中的所有字段值写入数据库,无论这些字段的值是否为 null

风险巨大。

有一张用户表, 在 salary 上添加 FieldStrategy.ALWAYS

(id,name,age,salary)

开发A:通过 id 更新 age, 但是 DO 没有设置 salary了,mybaits-plus 会添加 salary ,最终导致 salary 被更新为 null,导致数据丢失。

这种问题如果不注意,后果十分严重,不建议在 DO 上添加此策略。随着业务发展,人员变动,这种操作会给以后埋下隐患。

另外使用这种策略以后,对于批量更新简直噩梦!慎重!

自定义 sql 方式

如果需要更复杂的逻辑来决定何时将字段设置为 null,可以选择编写自定义的 XML 映射文件或者使用 @Select, @Update 等注解来定义 SQL 语句,在其中明确写出 SET column_name = NULL

其他策略("曲线救国")

如果是 String 类型,可以设置成"",例如: MapStruct 设置一个默认值。

less 复制代码
@Mappings({
        @Mapping(source = "name", target = "name", defaultValue = "")
})
UpdateParam convert(Request request);

结束

  1. 谨慎使用策略 FieldStrategy.ALWAYS/ FieldStrategy.IGNORED
  2. 更新使用 UpdateWrapper 或 LambdaUpdateWrapper
相关推荐
Java小生不才1 小时前
spring AI文生图
java·人工智能·spring ai
阿丰资源1 小时前
基于SpringBoot的在线视频教育平台的设计与实现(附源码+数据库+文档,一键运行)
数据库·spring boot·后端
苍煜1 小时前
ThreadPoolExecutor线程池终极全解:同步异步判定+SpringBoot生产实战
java·开发语言·spring boot
IT_陈寒1 小时前
我竟然被JavaScript的隐式类型转换坑了三天!
前端·人工智能·后端
Reart1 小时前
从0解构tinyWeb项目--(Day:9)
后端·架构·github
小码哥_常1 小时前
Java后端定时任务“三剑客”大比拼,选对不选贵!
后端
oldking呐呐1 小时前
MySQL从入门到入土 -- 2.数据库基础
后端·mysql
用户860821135651 小时前
从JVM到Spring Boot:一文搞懂胖Jar中的类加载机制
后端
小兵张健1 小时前
30天减20斤挑战:少一斤发100红包(2)
后端·程序员·全栈
汤姆Tom1 小时前
从 0 到 1 开发项目?你是否也是这样开始?先有再优化一步一步带你了解架构设计
前端·后端·架构