Mybatis-plus设置某个字段值为null的方法总结

 更新时间:2022年07月19日 09:23:35   作者:わたしわ  
mybatis-plus以下简称mp,目前应该也算是主流的一款数据访问层应用框架,下面这篇文章主要给大家介绍了关于Mybatis-plus设置某个字段值为null的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前提:

数据库表对应字段允许为null

使用Mybatis-plus操作数据库时,如果未自己写sql而是采用Mybatis-plus的方法设置sql的情况下,默认Mybatis-plus生成sql时会将设置为null的字段忽略掉(不更新该字段);所以默认情况下,使用Mybatis-plus的方法操作数据库时没办法设置一个字段的值为null(除非该字段数据库表设置默认值就为null)。

Mybatis-plus设计如此很好理解,比如现在我们的系统中一般都是做逻辑删除即修改删除标记的字段为删除状态的值,此时执行update语句时,一般根据id作为条件只设置删除标记字段的值就行,其他字段值不做设置也就是为null,如果Mybatis-plus也将这些字段进行更新的话,那么其他字段全是null,这样会造成数据丢失,问题很大;如果每个字段全部设置成之前的值,需要先进行一次查询操作,以及设置每个字段的值的操作,比较麻烦一些,很明显没有必要;所以Mybatis-plus默认忽略字段值为null的字段不做更新。

处理方法:

1、自己写sql

在mapper.xml中写对应的sql语句(insert语句/update语句/where条件中设置对应字段的值为null即可)

但是如果一张表的字段太多,仅仅只是某几个字段需要设置为null的话,简便处理方式可以采用下面的第二种和第四种(这两种使用不当有数据丢失风险,慎用)。

2、实体类对应字段添加注解

@TableField(insertStrategy = FieldStrategy.IGNORED)   添加该注解值的字段在Mybatis-plus生成insert sql时会忽略该字段值的判断
@TableField(updateStrategy = FieldStrategy.IGNORED)   添加该注解值的字段在Mybatis-plus生成update sql时会忽略该字段值的判断
@TableField(whereStrategy = FieldStrategy.IGNORED)    添加该注解值的字段在Mybatis-plus生成sql时的where条件中会忽略该字段值的判断
@TableField(insertStrategy = FieldStrategy.IGNORED,updateStrategy = FieldStrategy.IGNORED,whereStrategy = FieldStrategy.IGNORED)   前面三个的聚合

加上该注解之后,Mybatis-plus会在对应的情况下生成sql时忽略掉该字段值的判断;即该字段值不论是什么都会生成在sql中,就可以设置字段值为null了;但是这个是针对该字段生效,如果有些地方的操作,忘记设置该字段的值因为这个注解的原因,那么可能就会导致更新后,该字段为的值null,所以这种方式不推荐,推荐使用第一种自己写sql和第三种Mybatis-plus 3.x提供的新方法。

说明 FieldStrategy 的可选值:

FieldStrategy.NOT_NULL:不为null则更新,也就是字段值为null则不生成到sql中不更新该字段,如果字段值为""(空字符串)也是会更新的
FieldStrategy.NOT_EMPTY:不为空则更新,也就是该字段值为null或为""(空字符串)都不会更新
FieldStrategy.DEFAULT:默认值,和全局配置保持一致,也就是和下面的第四种方式中的配置保持一致
FieldStrategy.IGNORED:忽略判断,该字段值不论是什么,都进行更新
FieldStrategy.NEVER:不做更新操作,该字段值不论是什么,都不进行更新

3、使用Mybatis-plus 3.x版本提供的新方法

UpdateWrapper<TestIdcardEntity> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("name",null);
updateWrapper.eq("id",id);
testIdcardService.update(updateWrapper);

4、Mybatis-plus 全局参数配置(yaml方式配置如下)

全局配置的值可选项和第二种方式 FieldStrategy 的可选项一致,全局配置默认值为 not_null

mybatis-plus:
  global-config:
    db-config:
      insert-strategy: ignored
      update-strategy: ignored
      select-strategy: ignored

这种方式和第二种一样可能会使用不当导致字段值为null,数据丢失;并且该方式是全局配置,对所有表的实体类所有字段都生效,危害会更严重;如果同时配置了第二种,那么优先第二种生效。

总结:

第二种和第四种使用不当会有数据丢失的风险不建议使用,第一种和第三种推荐使用。

补充:解决MyBatis-Plus 更新字段为null 不生效

1.异常说明:

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

                periodRecordOriginal.setSettleTime(null);
                periodRecordOriginal.setActualSettleTime(null);
                periodRecordOriginal.setSettleStatus(0);
                int i = periodRecordMapper.updateById(periodRecordOriginal);

2.原理:

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

3.解决办法:

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

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

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

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

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

@TableField( updateStrategy = FieldStrategy.IGNORED)
    private Date settleTime;

到此这篇关于Mybatis-plus设置某个字段值为null的文章就介绍到这了,更多相关Mybatis-plus设置字段值null内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中UUID生成原理及优缺点

    Java中UUID生成原理及优缺点

    本文将详细讲解UUID的生成原理、特性、实用场景以及优缺点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • SpringBoot使用CommandLineRunner接口完成资源初始化方式

    SpringBoot使用CommandLineRunner接口完成资源初始化方式

    这篇文章主要介绍了SpringBoot使用CommandLineRunner接口完成资源初始化方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 详解Idea SpringBoot搭建SpringCloud的准备工作(推荐)

    详解Idea SpringBoot搭建SpringCloud的准备工作(推荐)

    这篇文章主要介绍了Idea SpringBoot搭建SpringCloud的准备工作(推荐),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • java中数组的相关知识小结(推荐)

    java中数组的相关知识小结(推荐)

    下面小编就为大家带来一篇java中数组的相关知识小结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • java图搜索算法之图的对象化描述示例详解

    java图搜索算法之图的对象化描述示例详解

    这篇文章主要为大家介绍了java图搜索算法之图的对象化描述示例详解,可以带你秒杀所有的图搜索算法,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • Java 给PPT添加动画效果的示例

    Java 给PPT添加动画效果的示例

    这篇文章主要介绍了Java 给PPT添加动画效果的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • JDK安装配置教程

    JDK安装配置教程

    这篇文章主要为大家详细介绍了JDK安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • SpringBoot 实现CAS Server统一登录认证的详细步骤

    SpringBoot 实现CAS Server统一登录认证的详细步骤

    ​ CAS(Central Authentication Service)中心授权服务,是一个开源项目,目的在于为Web应用系统提供一种可靠的单点登录,这篇文章主要介绍了SpringBoot 实现CAS Server统一登录认证,需要的朋友可以参考下
    2024-02-02
  • Java大数据处理的核心技术MapReduce框架

    Java大数据处理的核心技术MapReduce框架

    MapReduce是一种分布式计算框架,适用于大规模的数据处理。它将大数据分成多个小数据块,通过Map和Reduce两个阶段对数据进行处理和分析。MapReduce框架具有可靠、高效、可扩展等特点,已经成为大数据处理的核心技术
    2023-05-05
  • SpringBoot Event 事件如何实现异步延迟执行

    SpringBoot Event 事件如何实现异步延迟执行

    这篇文章主要介绍了Spring Boot Event 事件如何实现异步延迟执行问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论