关于更新字段为空值——MybatisPlus框架

背景:我们在项目开发过程中,可能会经常遇到这样的问题,某个前端的字段,用户把原本有值的改为空值了,用户的意愿肯定是要去更新的,前端此时会把这个字段传"null"或空字符串,但我们后端使用框架提供的api会自动将空值跳过不去更新。

一、框架api

java 复制代码
    /**
     * 根据 ID 修改
     *
     * @param entity 实体对象
     */
    int updateById(@Param(Constants.ENTITY) T entity);

    /**
     * 根据 whereEntity 条件,更新记录
     *
     * @param entity        实体对象 (set 条件值,可以为 null)
     * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
     */
    int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);

第二个api update方法,有误导,我一开始看到"set 条件值,可以为null",错把这个理解为可以将实体类为null字段去更新为null,后来才明白,它的本意是第一个实体类参数,可以直接传null,完全由第二个参数来控制set参数和where条件(详细可以去看mybatisPlus官网)

所以在不改mybatisPlus全局配置的前提下,上述两个update API,都不会去更新字段值为null的字段。

二、解决方案

1.在实体类添加注解

java 复制代码
      @TableField(updateStrategy = FieldStrategy.IGNORED)
       private String childJobId;

       @TableField(updateStrategy = FieldStrategy.IGNORED)
       private Integer executorTimeout;

注解枚举含义如下:

这种方法的优点就是方便,在实体类某个/某几个字段打上如上的注解,就可以将该字段字段值为null时也更新;

缺点那就是会影响所有的更新场景,关于这个实体的所有更新都会影响。

2.动态显示设置,结合 `Wrapper` 显式设置字段**

如果不想要第一种影响这个实体的所有更新场景,那就使用动态的Wrapper语句

java 复制代码
    LambdaUpdateWrapper<XxlJobInfo> updateWrapper = Wrappers.lambdaUpdate(XxlJobInfo.class)
           .eq(XxlJobInfo::getId, req.getId())
           .set(XxlJobInfo::getChildJobId, req.getChildJobId()) // 即使为 null 也会更新
           .set(XxlJobInfo::getExecutorTimeout, req.getExecutorTimeout());

       int infoUpdate = jobInfoMapper.update(null, updateWrapper);

优点:影响范围小,仅仅影响本方法中的更新,不会影响关于这个实体其他更新,其他更新方法该怎么更新还是怎么更新

缺点:繁琐,得把要更新的字段,一一设置

相关推荐
我命由我123452 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
武子康4 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
新world6 小时前
mybatis-plus从入门到入土(三):持久层接口之IService
mybatis
YuTaoShao7 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw7 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨7 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4048 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空8 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643149 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0019 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式