【转载】Mybatis-Plus使用updateById()、update()将字段更新为null_mybatis更新null字段-程序员宅基地

技术标签: mybatis-plus  

问题背景

昨晚同事找我帮他看一个问题,他使用mybatis-plus中提供的updateById方法,想将查询结果中某个字段原本不为null的值更新为null(数据库设计允许为null),但结果该字段更新失败,执行更新方法后还是查询的结果。

问题原因

mybatis-plus FieldStrategy 有三种策略:

  • IGNORED:0 忽略
  • NOT_NULL:1 非 NULL,默认策略
  • NOT_EMPTY:2 非空

而默认更新策略是NOT_NULL:非 NULL;即通过接口更新数据时数据为NULL值时将不更新进数据库。

解决方案

针对上述问题,利用自己的项目环境(使用的mybatis-plus版本是3.1)测试了一下,总结了以下三种解决方案。

(以下解决方案是基于直接使用mybatis-plus提供的方法使用的,如果习惯写sql,当然你也可以直接在xml中写sql实现)

1. 设置全局的field-strategy

在配置文件中,我们可以修改策略,如下:

#properties文件格式:
mybatis-plus.global-config.db-config.field-strategy=ignored

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

这样做是全局性配置,会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null,可能会影响其他业务数据的正确性。

2. 对某个字段设置单独的field-strategy

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

这样的话,我们只需要在需要更新为null的字段上,设置忽略策略,如下:

/**
 * 下架时间
 */
@TableField(strategy = FieldStrategy.IGNORED)
private LocalDateTime offlineTime;

在更新代码中,我们直接使用mybatis-plus中的updateById方法便可以更新成功,如下:

 /**
  * updateById更新字段为null
  * @param id
  * @return
  */
 @Override
 public boolean updateArticleById(Integer id) {
    
     Article article = Optional.ofNullable(articleMapper.selectById(id)).orElseThrow(RuntimeException::new);
     article.setContent("try mybatis plus update null again");
     article.setPublishTime(LocalDateTime.now().plusHours(8));
     article.setOfflineTime(null);
     int i = articleMapper.updateById(article);
     return i==1;
 }

使用上述方法,如果需要这样处理的字段较多,那么就需要涉及对各个字段上都添加该注解,显得有些麻烦了。

那么,可以考虑使用第三种方法,不需要在字段上加注解也能更新成功。

3. 使用UpdateWrapper方式更新

在mybatis-plus中,除了updateById方法,还提供了一个update方法,直接使用update方法也可以将字段设置为null,代码如下:

 /**
  * update更新字段为null
  * @param id
  * @return
  */
 @Override
 public boolean updateArticleById(Integer id) {
    
     Article article = Optional.ofNullable(articleMapper.selectById(id)).orElseThrow(RuntimeException::new);
     LambdaUpdateWrapper<Article> updateWrapper = new LambdaUpdateWrapper<>();
     updateWrapper.set(Article::getOfflineTime,null);
     updateWrapper.set(Article::getContent,"try mybatis plus update null");
     updateWrapper.set(Article::getPublishTime,LocalDateTime.now().plusHours(8));
     updateWrapper.eq(Article::getId,article.getId());
     int i = articleMapper.update(article, updateWrapper);
     return i==1;
 }

这种方式不影响其他方法,不需要修改全局配置,也不需要在字段上单独加注解,所以推荐使用该方式。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/t194978/article/details/123412697

智能推荐

@RequestParam传参_@requestparam 传参-程序员宅基地

文章浏览阅读2.3k次。@RequestParam传参java控制器出现了@RequestParam,传参是由url进行传,例如:http://localhost:8001/proxyApi/prod/prod/ prodStatus?prodId=75&prodStatus=1中高亮部分。由于健忘,记录一下!!!_@requestparam 传参

Python零基础入门(二)——Python中常见的数据结构[学习笔记]_通过索引获取字符串“intelligent”中的第2 个字符和截取字符串“intelligent”的-程序员宅基地

文章浏览阅读324次。目录字典访问字典种的值更新字典使用get()方法返回给定键的值删除键同时也能返回值遍历字典元祖初始化访问元祖内的值切分元祖元祖方法index方法(索引)count方法(计数)遍历元祖元祖拆包枚举元祖与列表的优劣分析..._通过索引获取字符串“intelligent”中的第2 个字符和截取字符串“intelligent”的

整理计算机的硬盘,史上最全的电脑清理磁盘方法 让你电脑速度像过山车一样快...-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏5次。史上最全的电脑清理磁盘方法 让你电脑速度像过山车一样快发布时间:2012-12-11 15:25:50 作者:佚名 我要评论史上最全的电脑清理磁盘方法,让你电脑速度像过山车一样快速,本文由电脑百事网整理而成,涉及到诸多电脑知识与电脑技巧,值得菜鸟朋友学习与参考,文章比较长,建议大家没时间阅读先收藏一、每天关机前要做的清洗:双击“我的电脑”— —右键点C盘——点“属性”——点“磁盘清理”—..._电脑清理磁盘

GO语言的进阶之路-面向过程式编程-程序员宅基地

文章浏览阅读235次。                   GO语言的进阶之路-面向过程式编程                                                作者:尹正杰版权声明:原创作品,谢绝转载!否则将追究法律责任。    我们在用Go..._172.16.3.211

关于Git无法提交 index.lock的解决办法-程序员宅基地

文章浏览阅读74次。今天提交代码时,在一次提交,莫名其妙没成功后,再次用git commit -a命令时,出现以下错误,无论是用git还是TortoiseGit都会出现以下这个问题。。$ git commit -afatal: Unable to create 'e:/git/Android/XXXXXX/.git/index.lock': File exists.If no other git proce...

word中选不中、删不掉、造成奇怪问题的横线_word删除一行无法选中的横线csdn-程序员宅基地

文章浏览阅读1.7w次,点赞7次,收藏7次。有时候word中的横线,选不中、删不掉、还造成奇怪问题。网上没有找到切中要害的解决办法。第一种情况例如下图中的第二页顶端的横线,不在页眉处,选不中,也删不掉。用word自带功能插入文献时,怪怪的。如图,文献没有插在文章尾部。解决方法选大纲视图从菜单栏引用、显示备注、删除注延续分隔符下面的横线。关闭大纲视图,返回页面视图,适当调整,结果如下第二种情况如图的横线,选中后删不..._word删除一行无法选中的横线csdn

随便推点

CCS(Code Composer Studio) 的下载、安装和导入工程_code composer studio下载-程序员宅基地

文章浏览阅读1.5w次,点赞18次,收藏56次。1.下载 网址https://software-dl.ti.com/ccs/esd/documents/ccs_downloads.html#Download_the_latest_CCS2.安装(这里就是小编的泪点了) 点开exe文件点击next 同意后next 注意,下一步理想情况下是这样,这里是在正式安装前检查一下电脑的安装条件。这里五条都OK的话可以增大安装成功的机率。相信很多朋..._code composer studio下载

01.numpy中判断None和nan方法_numpy去除none-程序员宅基地

文章浏览阅读3.2k次。这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar_numpy去除none

分析rwlock的结构 _tasklist_lock-程序员宅基地

文章浏览阅读1.9k次。分析rwlock的结构 typedef struct { volatile unsigned int lock;} rwlock_t;rwlock_t tasklist_lock __attribute__((__aligned__((1 )),__section__(".data.cacheline_aligned"))) = (rwlock__tasklist_lock

DELL戴尔服务器RAID磁盘阵列默认识别更换后的硬盘_raid enable auto import-程序员宅基地

文章浏览阅读1.1k次。如果没有默认设置BIOS启动,请先配置BIOS启动,参见下文:《UEFI 引导与 BIOS 引导》《如何部署一台DELL虚拟化服务器:CentOS7.4系统,虚拟化技术》对BIOS的设置有介绍。1.启动界面按ctrl+R进入如下界面:2.按ctrl+N选择进入控制管理界面3.勾选enable auto import后,应用退出..._raid enable auto import

用imu_utils标定IMU-程序员宅基地

文章浏览阅读767次。https://blog.csdn.net/fang794735225/article/details/92804030#commentBox

linux hdparm's -y 和 -Y 的区别-程序员宅基地

文章浏览阅读880次。-y Force an IDE drive to immediatelyenter the low power consumptionstandby mode, usually causingit to spindown. The currentpower mode status can be checked using the -C flag.-Y F...