前提:

数据库表对应字段允许为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内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Mybatis-plus设置某个字段值为null的方法总结的更多相关文章

  1. ios检查是否nsarray == null

    我收到了JSON的一些响应,并且工作正常,但是我需要检查一些空值,我找到不同的答案,但似乎不工作,我试过了那么发生了什么呢?如何解决这个问题并在我的数组中检查null?

  2. ios – TabBarController返回null

    我在故事板中有一个tabbarcontroller作为初始视图控制器这是如何返回null的本来就是我想要做的为什么我会变空?

  3. Swift解析Json返回值为null的问题

    nil用来给对象赋值,NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值,而NSNull则用于集合操作,虽然它们表示的都是空值,但使用的场合完全不同。

  4. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  5. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. MyBatis-Plus乐观锁插件的用法小结

    乐观锁很乐观,对任何事情都保持着一个乐观的态度,认为别人不会修改数据,所以不会上锁,只是在更新数据的时候,去判断这条数据有没有被别人修改过,这篇文章主要介绍了MyBatis-Plus乐观锁插件的用法,需要的朋友可以参考下

  7. Mybatis-Plus主键生成策略的方法

    本文主要介绍了Mybatis-Plus主键生成策略的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. mybatis-plus自带QueryWrapper自定义sql实现复杂查询实例详解

    MyBatis-Plus是一个MyBatis(opens new window)的增强工具,在 MyBatis的基础上只做增强不做改变,MyBatis可以无损升级为MyBatis-Plus,这篇文章主要给大家介绍了关于mybatis-plus自带QueryWrapper自定义sql实现复杂查询的相关资料,需要的朋友可以参考下

  9. Java的ConcurrentHashMap中不能存储null的原因解析

    众所周知,在Java中Map可以存储null,而ConcurrentHashMap不能存储null值,那么为什么呢?今天通过源码分析给大家详细解读,感兴趣的朋友一起看看吧

  10. 使用JSON.toJSONString格式化成json字符串时保留null属性

    这篇文章主要介绍了使用JSON.toJSONString格式化成json字符串时保留null属性,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部