• MyBatis-Plus更新字段为null时,update语句为null字段不生效的解决方法


    1.异常说明:

    mapper.updateById()时, set为null 未生效,其他字段更新。

    
       puDeclareElements.setStatus(OrderEnum.DRAFTS.getType());
       puDeclareElements.setSubmitBy(null);
       puDeclareElementsService.updateById(puDeclareElements)
       
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.原理:

    MyBatis-Plus对字段的验证策略导致的,MyBatis-Plus默认进了不是全量更新的策略,默认忽略为null 的字段的

    3.解决办法:

    1)修改MyBatis-Plus 全局默认策略

    缺点:这样做会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null

    
    mybatis-plus:
      global-config:
      	#字段策略 0:"忽略判断",1:"非 NULL 判断",2:"非空判断"
        field-strategy: 0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2)修改实体类注解,改变字段的忽略判断

    缺点:需要注意数据库字段是否设置为 非null ,如果为非null 也更新不成功

    
    @TableField( updateStrategy = FieldStrategy.IGNORED)
    private Date settleTime;
    
    
    • 1
    • 2
    • 3
    • 4

    4.字段策略全解

    1)官方文档

    Mybatis-Plus中FieldStrategy说明:​ ​https://baomidou.com/pages/223848/#tableid​

    2)字段策略介绍​​

    1、FieldStrategy作用

    Mybatis-Plus字段策略FieldStrategy的作用主要是在进行新增、更新时,根据配置的策略判断是否对实体对象的值进行空值判断,如果策略为字段不能为空,则不会对为空的字段进行赋值或更新。
    同样,在进行where条件查询时,根据whereStrategy策略判断是否对字段进行空值判断,如果策略为字段不能为空,则为空的字段不会作为查询条件组装到where条件中。

    三个配置,对应三种使用场景

    ​​insertStrategy​​ : 在insert操作时的字段策略,是否进行空值判断,插入空值
    ​​updateStrategy : 在update操作时的字段策略,是否进行空值判断,插入空值
    ​​whereStrategy : ​​在where条件组装时,是否进行控制判断,将空值作为查询条件

    在这里插入图片描述

    2、FieldStrategy类型

    FieldStrategy的源码中,一共有5种策略类型

    public enum FieldStrategy {
        IGNORED,
        NOT_NULL,
        NOT_EMPTY,
        DEFAULT,
        NEVER;
    
        private FieldStrategy() {
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    每种策略的作用

    描述
    IGNORED

    忽略空值判断,实体对象的字段是什么值就用什么值更新,支持null值更新操作

    NOT_NULL

    进行非NULL判断,也是默认策略,相当于age!=null

    NOT_EMPTY

    进行非空判断,主要是针对字符串类型,相当于name != null and name != ‘’

    NEVER

    从不更新,不管字段是否有值,都不进行更新

    DEFAULT

    追随全局配置

    3、FieldStrategy配置

    ① 全局策略配置

    在全局配置中,三者的默认值都是​​FieldStrategy.NOT_NULL​​,即进行空值判断,不对NULL值数据进行处理。

    public DbConfig() {
        this.idType = IdType.ASSIGN_ID;
        this.tableUnderline = true;
        this.capitalMode = false;
        this.logicDeleteValue = "1";
        this.logicNotDeleteValue = "0";
        this.insertStrategy = FieldStrategy.NOT_NULL;
        this.updateStrategy = FieldStrategy.NOT_NULL;
        this.whereStrategy = FieldStrategy.NOT_NULL;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在spring boot中可以通过配置属性修改全局字段策略:

    mybatis-plus.global-config.db-config.update-strategy=not_null
    mybatis-plus.global-config.db-config.insert-strategy=not_null
    mybatis-plus.global-config.db-config.where-strategy=not_null
    
    • 1
    • 2
    • 3
    ② 单字段策略配置

    在实体对象中,通过​​@TableField​​注解可以针对单个字段指定字段策略。

    3)实战说明

    1、忽略判断-IGNORED

    @TableName(value ="user")
    @Data
    public class User implements Serializable {
       @TableId
       private Long id;
       private String name;
       private Integer age;
       @TableField(updateStrategy = FieldStrategy.IGNORED)
       private String email;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    再次执行上面的单元测试:

    在这里插入图片描述

    PS:后面就不一一举例了。可以看官网。写的很详细。

  • 相关阅读:
    npm create vue@latest 原理
    使用gluon实现简单的CNN
    Spring IoC 和 AOP
    R函数optim()最小化或者最大化多参数函数
    如何向PDB文件添加双键
    栅极驱动器SCT52240STDR ,SCT51240TWBR
    【OpenCV学习】第5课:图像模糊(均值滤波,高斯滤波)
    C语言文件操作
    leetcode-1678-设计 Goal 解析器(简单,基本逻辑)
    SpringBoot自动装配
  • 原文地址:https://blog.csdn.net/y2020520/article/details/132827206