• 解决MyBatis-Plus updateById方法更新不了空字符串或null


    概要

    在用mybatis-plus封装的updateById方法来更新数据时,想把一个字段设置为null值,但是发现更新后数据没有为null还是原来的值,这是因为mybatis-plus在更新的时候做了null判断,默认不更新为null的传参。可以在配置文件中设置update-strategy为ignored来全局处理,也可以在字段上设置注解来单个处理:@TableField(updateStrategy = FieldStrategy.IGNORED)。在低版本的mybatis-plus中可以全局设置field-strategy为ignored,或单个字段设置注解
    @TableField(strategy = FieldStrategy.IGNORED)来处理。

    FieldStrategy 策略:

    描述
    IGNORED忽略判断 无论实体对象的字段值是否为空,都会进行更新操作
    NOT_NULL(默认选项)非 NULL 判断
    NOT_EMPTY非空判断(只对字符串类型字段,其他类型字段依然为非 NULL 判断) 相当于mybatis的xml文件中的if判定条件判断:name != null and name != ‘’
    DEFAULT追随全局配置
    NEVER不加入SQL 不但会忽略字段值的空值判断,而且不管标识的字段是否有值,都不会进行更新操作

    解决办法

    当用户有更新字段为 空字符串 或者 null 的需求时,需要对 FieldStrategy 策略进行调整:

    方式一:调整全局的验证策略

    注入配置 GlobalConfiguration 属性 fieldStrategy

    配置文件中设置update-strategy为ignored来全局处理

    mybatis-plus:
      # 搜索指定包别名
      typeAliasesPackage: com.cyl.**.domain, com.ruoyi.common.core.domain.entity,  com.ruoyi.**.domain
      # 配置mapper的扫描,找到所有的mapper.xml映射文件
      mapperLocations: classpath*:mapper/**/*Mapper.xml
      # 加载全局的配置文件
      configLocation: classpath:mybatis/mybatis-config.xml
      global-config:
        db-config:
          id-type: auto
          update-strategy: ignored
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在低版本的mybatis-plus中可以全局设置field-strategy为ignored

    # Mybatis 配置
    mybatis-plus:
        # 如果是放在src/main/java目录下
        mapper-locations: classpath*:/com/chilin/*/dao/mapper/*Mapper.xml
        # 实体扫描,多个package用逗号或者分号分隔
        typeAliasesPackage: com.chilin.*.entity
        global-config:
            db-config:
                # 主键类型  AUTO:"数据库ID自增", INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
                id-type: ID_WORKER
                # 字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"
                field-strategy: IGNORED
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    方式二:调整字段验证注解

    根据具体情况,在需要更新的字段中调整验证注解:
    @TableField(updateStrategy=FieldStrategy.IGNORED)

    低版本:
    @TableField(strategy=FieldStrategy.IGNORED)

    方式三:使用 UpdateWrapper (3.x)

    使用以下方法来进行更新或插入操作:

    //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)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    insertStrategy updateStrategy whereStrategy

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

  • 相关阅读:
    Tensorflow Bug :got shape [1, 7], but wanted [1].
    机器学习笔记 - 模式识别的应用场景之一简单车牌识别
    Spire.PDF for .NET【文档操作】演示:设置 PDF 文档的 XMP 元数据
    饥荒服务器阿里云租用价格表一年和一个月收费报价表
    PHP: GetCattle算法(N年后有多少头牛)(附完整源码)
    SpringCloud案例day04.md
    适用于 Windows 的 10 个最佳视频转换器:快速转换高清视频
    【Java基础】四张图轻松拿捏Java VisualVM添加Visual GC插件实现JVM性能调优
    3.1.2 内存池的实现与场景分析
    铭文是什么?有什么价值?
  • 原文地址:https://blog.csdn.net/qq_27575627/article/details/126895497