全网详解MyBatis-Plus updateById方法更新不了空字符串或null的解决方法
文章目录
- 1. 文章引言
- 2. 分析问题
- 3. 解决问题
- 3.1 方法1:全局配置方式
- 3.2 方法2:非null字段验证策略
- 3.3 方法3:通过注解的方式
- 4. 总结
1. 文章引言
在开发的过程中,我们经常使用MyBatis-Plus
的updateById
方法更新数据表,但今天在更新appConfig
表时,发现无法将content
字段更新为null
。
如下是我的测试代码:
@Test
public void testUpdateById() {Long id = 10L;AppConfig beforeAppConfig = appConfigService.getById(id);System.out.println("输出更新 前 的应用配置内容:" + beforeAppConfig.getContent());System.out.println();// 将 id = 10的应用配置的内容修改 nullbeforeAppConfig.setContent(null);appConfigService.updateById(beforeAppConfig);// 查询更新的 id = 10的应用配置的内容AppConfig afterAppConfig = appConfigService.getById(id);System.out.println("输出更新 后 的应用配置内容:"+afterAppConfig.getContent());
}
输出结果如下图所示:
由上图可知,更新前后输出的内容不变。
换句话说,上述此代码 beforeAppConfig.setContent(null);
虽然设置content
为null
,但数据库并没有将content
更新为null
。
这是什么原因呢?
2. 分析问题
想要搞清楚没有将content
更新为null
原因,我们不妨看看上图中的用绿色框圈出来的MyBatis-Plus
打印出的mysql
语句,如下所示:
UPDATE app_config SET create_time=? WHERE id=?
你会清楚地看到,mysql
语句中没有content
字段。
按照预期结果,MyBatis-Plus
打印出的mysql
语句应该如下:
UPDATE app_config SET create_time=?, content=? WHERE id=?
为什么MyBatis-Plus
没有按预期打印出的mysql
语句,经过查找资料可得。
其实是MyBatis-Plus
对字段的验证策略导致的,MyBatis-Plus
默认进行了不是全量更新的策略。
查阅官网发现有一个属性,而我的application.yml
没有配置这个属性,如下代码所示:
#mybatis配置
mybatis-plus:mapper-locations: classpath*:/mapper/*Mapper.xmltype-aliases-package: com.superjson.superjsonmanager.mapperconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 按下划线转驼峰规则映射数据库字段与java bean属性之间的关系map-underscore-to-camel-case: true# 关闭一级缓存# local-cache-scope: statement# 关闭二级缓存# cache-enabled: falseglobal-config:db-config:id-type: autologic-delete-value: -1logic-not-delete-value: 0
如果没有配置这个属性,那么,MyBatis-Plus
采用了默认的字段验证策略。
这个属性就是field-strategy
,在原application.yml
中加入该属性,如下代码所示:
global-config:#字段策略 0:忽略判断,1:非NULL判断,2:非空判断field-strategy: 1db-config:id-type: autologic-delete-value: -1logic-not-delete-value: 0
field-strategy
字段更新插入策略属性说明:
-
IGNORED(0)
: “忽略判断”, 所有字段都更新和插入 -
NOT_NULL(1)
:“非 NULL 判断”, 只更新和插入非NULL
值 -
NOT_EMPTY(2)
:“非空判断”,只更新和插入非NULL
值且非空字符串
field-strategy
默认策略是NOT_NULL(1)
,即更新的时候做了null
判断,默认不更新为null
的传参。
3. 解决问题
既然知道了问题所在,便可以通过如下三种方式解决。
3.1 方法1:全局配置方式
在MyBatis-Plus
配置文件中修改field-strategy
字段验证的值为0
,即忽略判断,如下代码所示:
global-config:#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"field-strategy: 0db-config:id-type: autologic-delete-value: -1logic-not-delete-value: 0
如是配置后,并参照网上说的,在PO
对象(即@TableField(value="content"
)修饰字段的时候,还需要加入el
属性,但我是新版本的MyBatis-Plus
,已经不支持el
属性了,如下源码所说:
我虽然在content
对象上加上update
属性,如下代码所示:
/** 配置内容 */
@TableField(value = "content",update = "null" )
private String content;
仍无法将content
字段修改为null
,如下图所示:
如果有知道的,可以在评论区中留言,不胜感激。
此外,如果你的MyBatis-Plus
版本支持el
。你在设置了 field-strategy: 0
的前提下,同时你已确保了你的PO
对象(即@TableField(value="XSID")
修饰字段加入了el
属性 (每个属性对应数据库的jdbcType类型,这样才能成功更新空值或null),如下图:
你可以采用el
的这种方式修改。
3.2 方法2:非null字段验证策略
配置完成后,测试类修改完成,并重新启动,如下图所示:
此时,你会发现可以更新空字符串' '
,如下图所示:
但是一些比如Date
等对象类型的设置空是要设置为null
的,你会发现一样更新不了null
。
3.3 方法3:通过注解的方式
由于表中的字段基本上都是varchar
字符类型的,所以此时可以在PO
中对类型为对象类型的属性,通过注解对对象类型的属性单独设置字段验证策略为IGNORED
,如下代码所示:
/** 配置内容 */
@TableField(value = "content",updateStrategy = FieldStrategy.IGNORED)
private String content;
同时修改测试代码,如下图所示:
这样就可以成功更新值为null
或者空字符串' '
了,问题解决,如下图所示:
如果你的MyBatis-Plus
版本和我的版本不同,你可能是下图中的注解,同样能解决问题。
4. 总结
如果你不是使用上述方式解决了你的问题,欢迎在评论区留言。
相关文章:
![](https://img-blog.csdnimg.cn/f88baa7c68b14532888fd8424a54275a.png)
全网详解MyBatis-Plus updateById方法更新不了空字符串或null的解决方法
文章目录1. 文章引言2. 分析问题3. 解决问题3.1 方法1:全局配置方式3.2 方法2:非null字段验证策略3.3 方法3:通过注解的方式4. 总结1. 文章引言 在开发的过程中,我们经常使用MyBatis-Plus的updateById方法更新数据表,…...
![](https://img-blog.csdnimg.cn/img_convert/a4ab7d085b51bdda0c3d505e22f10614.png)
联想K14电脑开机全屏变成绿色无法使用怎么U盘重装系统?
联想K14电脑开机全屏变成绿色无法使用怎么U盘重装系统?最近有用户使用联想K14电脑的时候,开机后桌面就变成了绿色的背景显示,无法进行任何的操作。而且通过强制重启之后还是会出现这个问题,那么这个情况如何去进行系统重装呢&…...
![](https://img-blog.csdnimg.cn/19805bdf006140d5bdde0649e4738205.png#pic_center)
Spring Boot HTTP 400排查
背景 前段时间朋友咨询他们公司某个HTTP接口偶现400错误,有没有什么好的分析方法和解决方案,使用的是Spring Cloud体系。最近有时间总结下这个问题的处理过程。 为了分析问题,笔者使用 Spring Boot 3.0.2还原报错场景进行讲解。 问题分析 …...
![](https://www.ngui.cc/images/no-images.jpg)
【手撕源码】vue2.x中keep-alive源码解析
🐱 个人主页:不叫猫先生 🙋♂️ 作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门…...
![](https://img-blog.csdnimg.cn/img_convert/94cb8d698bea4e858eb3ba3154ac306d.png)
ROS2机器人编程简述humble-第四章-BASIC DETECTOR .3
书中程序适用于turtlebot、husky等多种机器人,配置相似都可以用的。支持ROS2版本foxy、humble。基础检测效果如下:由于缺¥,所有设备都非常老旧,都是其他实验室淘汰或者拼凑出来的设备。机器人控制笔记本是2010年版本。…...
![](https://img-blog.csdnimg.cn/cb7e0f4e06064d1bbe9eb67664f97282.png)
【图像分类】基于PyTorch搭建LSTM实现MNIST手写数字体识别(双向LSTM,附完整代码和数据集)
写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 在https://blog.csdn.net/A…...
![](https://img-blog.csdnimg.cn/2a5ea7abac614bb2ad15a6c100d03ddc.png)
【Linux】多线程编程 - 同步/条件变量/信号量
目录 一.线程同步 1.什么是线程同步 2.为什么需要线程同步 3.如何实现线程同步 二.条件变量 1.常见接口以及使用 2.wiat/signal中的第二个参数mutex的意义 3.代码验证 三.POSIX信号量 1.概念 2.常见接口以及使用 四.条件变量vsPOSIX信号量 一.线程同步 1.什么是线…...
![](https://www.ngui.cc/images/no-images.jpg)
ES优化方案
ES优化&联合HBASE: 【Elasticsearch】优秀实践-ESHbase的实现_少加点香菜的博客-CSDN博客_sceshbase ES写入性能优化方案 ElasticSearch 调优笔记_index.refresh_interval_六月飞雪的博客-CSDN博客 es如何提升写入性能_婲落ヽ紅顏誶的博客-CSDN博客_es写入性…...
![](https://img-blog.csdnimg.cn/a3ceeb7f132f4e0dbaa9af596c374d7c.png)
从数据备份保护到完整生命周期管理平台,爱数全新发布 AnyBackup Family 8
编辑 | 宋慧 出品 | CSDN 云计算 从2003年创业,开始做数据备份技术,爱数已经走过了近20年的时间。现在,数据的价值被越来越多的业界与用户看到,数据分析应用赛道近年一直持续火热。而现在的爱数在做的,已经从数据的备…...
![](https://img-blog.csdnimg.cn/img_convert/c047b9c5e83d3a9f1c4b497205535daf.gif)
Go 微服务开发框架 DMicro 的设计思路
Go 微服务开发框架 DMicro 的设计思路 DMicro 源码地址: Gitee:dmicro: dmicro是一个高效、可扩展且简单易用的微服务框架。包含drpc,dserver等 背景 DMicro 诞生的背景,是因为我写了 10 来年的 PHP,想在公司内部推广 Go, 公司内部的组件及 rpc 协议都…...
![](https://www.ngui.cc/images/no-images.jpg)
浅谈功能测试
1.功能测试流程 1.1 功能测试流程 # 功能测试大致按照以下流程进行: (1).需求分析与评审(2).测试计划与测试方案(3).测试用例设计(4).测试用例评审(5).执行用例(6).缺陷跟踪及报告产出 1.2 功能测试流程详解 (1).需求分析与评审 功能测试应从需求出发, 功能测试就是尽量覆…...
![](https://img-blog.csdnimg.cn/img_convert/43bb300222808f4d538ae6abfc17a13e.png#pic_center)
UDP的详细解析
UDP的详细解析 文章目录UDP的详细解析UDP 概述UDP的首部格式检验和的计算抓包测试参考TCP/IP运输层的两个主要协议都是互联网的正式标准,即:用户数据报协议UDP (User Datagram Protocol)传输控制协议TCP (Transmission Control Protocol) 按照OSI的术语…...
![](https://img-blog.csdnimg.cn/img_convert/19bf774430d4f85d9a2a0f242ce449c6.png#pic_center)
史上最详细JUC教程之Synchronized与锁升级详解
在Java早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的Mutex Lock来实现的,挂起线程和恢复线程都需要转入内核态去完成,阻塞或唤醒一个Java线程需…...
![](https://img-blog.csdnimg.cn/b2d67403577141938f0fe94958220e37.png)
Vue|初识Vue
Vue是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助开发者高效地开发用户界面。 初识Vue1. Vue简介2. 开发准备3. 模板语法3.1 差值语法3.2 指令语法4. 数据绑定4.1 单向数据…...
![](https://img-blog.csdnimg.cn/img_convert/3e4b582390924d9c841a00eed95859f1.jpeg)
在职阿里6年,一个29岁女软件测试工程师的心声
简单的先说一下,坐标杭州,14届本科毕业,算上年前在阿里巴巴的面试,一共有面试了有6家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少)其中成功的有4家&…...
![](https://img-blog.csdnimg.cn/img_convert/4bf6d4b28714640c6f6f3861f1356e1b.jpeg)
(C语言)自定义类型,枚举与联合
问:1. 结构体在自引用的时候不能怎么样?可以怎么样?2. Solve the problems:自定义一个学生结构体类型,要包含姓名,性别,年龄,六科成绩,家乡(也为结构体&#…...
![](https://www.ngui.cc/images/no-images.jpg)
node.js服务端笔记文档学会写接口,学习分类:path、包、模块化、fs、express、中间件、jwt、开发模式、cors。
node.js 学习笔记 node.js服务端笔记文档学会写接口,path、包、模块化、fs、express、中间件、JWT、开发模式、cors。 gitee:代码接口笔记 1什么是node.js nodejs 是基于ChromeV8,引擎的一个javaScript 运行环境。node.js 无法使用DOM和BO…...
![](https://img-blog.csdnimg.cn/4b8761df325944ef9c48aba82fbd723c.png)
初始C++(三):引用
文章目录一.引用的概念二.引用的使用1.引用作为输出型参数2. 引用作为函数返回值3.const引用三.引用的一些小问题四.引用和指针五.引用和指针的区别一.引用的概念 引用的作用是给一个已经存在的变量取别名,编译器不会为引用变量开空间,引用变量和被他引…...
![](https://img-blog.csdnimg.cn/32db49bc83a24c2cacde8a85fa6ef2f1.png)
【前端】参考C站动态发红包界面,高度还原布局和交互
最近有些小伙伴咨询博主说前端布局好难,其实都是熟能生巧! 模仿C站动态发红包界面,cssdiv实现布局,纯javascript实现交互效果 目录 1、界面效果 2、界面分析 2.1、整体结构 2.2、标题 2.3、表单 2.4、按钮 3、代码实现 3.…...
![](https://img-blog.csdnimg.cn/img_convert/2382b5347ba03b682c44a2ef910572e0.jpeg)
VR全景带你浪漫“狂飙”情人节,见证甜蜜心动
当情人节遇上VR,足以让情侣过一个难忘的情人节。马上情人节就要到了,大家是不是还在绞尽脑汁的想着,如何和另一半过一个浪漫的情人节呢?老套的剧情已经不能吸引人了,让我们看看VR全景给情人节带来了哪些不同的体验吧&a…...
![](https://img-blog.csdnimg.cn/579bdf9e60694415801e312b608afdf6.png)
Linux系统安全之iptables防火墙
目录 一.iptables防火墙基本介绍 二.iptables的四表五链 三.iptables的配置 1.iptables的安装 2.iptables防火墙的配置方法 四.添加、查看、删除规则 1.查看(fliter)表中的所有链 iptables -L 2.使用数字形式(fliter)表所有链 查看输出结果 iptables -nL 3.清空表中所…...
![](https://www.ngui.cc/images/no-images.jpg)
【C#基础】C# 变量与常量的使用
序号系列文章1【C#基础】C# 程序通用结构2【C#基础】C# 基础语法解析3【C#基础】C# 数据类型总结文章目录前言一. 变量(variable)1,变量定义及初始化2,变量的类别3,接收输出变量二. 常量(constantÿ…...
![](https://img-blog.csdnimg.cn/6ad497c5c195459b8cfdd024c4400c52.png)
[ 常用工具篇 ] CobaltStrike(CS神器)基础(一) -- 安装及设置监听器详解
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...
![](https://img-blog.csdnimg.cn/img_convert/f89a9b379874a2b280e99b9732999f0a.png)
Redis集群
Redis集群 本章是基于CentOS7下的Redis集群教程,包括: 单机安装RedisRedis主从Redis分片集群 1.单机安装Redis 首先需要安装Redis所需要的依赖: yum install -y gcc tcl然后将课前资料提供的Redis安装包上传到虚拟机的任意目录ÿ…...
![](https://img-blog.csdnimg.cn/f0596ccab902460fa49402fea3b8198a.png)
00---C++入门
1. C关键字(C98) C总计63个关键字,C语言32个关键字 2. 命名空间 在C/C中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进…...
![](https://img-blog.csdnimg.cn/b4232f249a1544faa4a59897e26f524d.png)
Spring-事务2
文章目录前言一、事务的特性(ACID)二、事务的隔离级别三、spring中的事务平台事务管理器.事务定义ISOLation_XXX:**事务隔离级别.**PROPAGATION_XXX:**事务的传播行为**.事务状态关系:四、使用XML文件配置事务1、 搭建…...
![](https://img-blog.csdnimg.cn/a71dc6bda5f248808c7baac43e835cac.png)
Windows Git Bash 配置
Windows Git Bash 配置 本文参考的文章: 在 Windows 的 Git Bash 中使用包管理器 - iris (ginshio.org)Git bash 安装 pacman & Windows 解压 zst 文件 | 伪斜杠青年 (lckiss.com) 一、Git的安装 Git 的安装应该是都会的,但还是应该说以下&#…...
![](https://www.ngui.cc/images/no-images.jpg)
java代码整合kettle9.3实现读取表中的数据,生成excel文件
java代码整合kettle9.3实现读取表中的数据,生成excel文件 1.简介 本次使用java代码整合kettle9.3版本,数据库使用mysql。 2.jar包导入 项目需要依赖部分kettle中的jar包,请将这部分jar包自行导入maven仓库。 <dependency><groupId…...
![](https://img-blog.csdnimg.cn/img_convert/a52898e7c5561b8ce3ba9fc22ba597eb.png)
分享微信点餐小程序搭建步骤_微信点餐功能怎么做
线下餐饮实体店都开始摸索发展网上订餐服务。最多人选择的是入驻外卖平台,但抽成高,推广还要另买流量等问题,也让不少商家入不敷出。在这种情况下,建立自己的微信订餐小程序,做自己的私域流量是另一种捷径。那么&#…...
![](https://img-blog.csdnimg.cn/9547dcff89f348feb5436404c9427d2d.png)
4、数组、切片、map、channel
目录一、数组二、切片三、map四、channel五、引用类型一、数组 数组: 数组是块连续的内存空间,在声明的时候必须指定长度,且长度不能改变所以数组在声明的时候就可以把内存空间分配好,并赋上默认值,即完成了初始化数组…...
![](https://img-blog.csdnimg.cn/20200516090214747.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppbnBlbmdfY3VtdA==,size_16,color_FFFFFF,t_70)
龙岩网站开发较好的公司/宁波超值关键词优化
一、模糊控制基本概念 1. 定义 以模糊集合理论、模糊语言变量及模糊推理为基础的一类控制方法。模糊控制原理框图如图1-1所示。 图1-1 模糊控制原理框图 注:图片来源于《智能控制》(第4版),刘金坤 2. 组成 模糊控制器(Fuzzy C…...
![](/images/no-images.jpg)
宁夏信用建设官方网站/最新百度新闻
sp_executesql 可能用 exec sp_executesql sqltext,paramstring,urlM_ID output 来得到动态执行中返回值,sqltext的长度可能超过了4000字符,可以使用nvarchar(max)解决,类似于: declare request1 nvarchar(4000) declare request2…...
![](/images/no-images.jpg)
学校网站建设栏目设置/广告投放代理商加盟
Swift JSON 发展史 最开始的时候还是使用NSJSONSerialization转成字典和数组来使用!后来苹果用Swift重新实现了JSONSerialization可以避免用NSArray和NSDictionary来桥接,提高解析效率。随后很多三方JSON库相继出现,例如:SwiftyJS…...
![](/images/no-images.jpg)
wordpress tag__not_in/百度推广开户电话
1、登录ftp代码:lftp 用户名:密码ftp地址:传送端口(默认21)用法(1)lftp username:password127.0.0.1:21 回车(2)lftp username127.0.0.1 回车 ##默认21端口 回车后输入密码(3)lftp 127.0.0.1 回车 ##回车后 login 登录(4)lftp 回车 --> open 12…...
![](/images/no-images.jpg)
提供网站建设收费标准/小程序开发哪家好
目录 题目 思路 考点 Code 题目 特定大小的停车场,数组cars[]表示,其中1表示有车,0表示没车。 车辆大小不一,小车占一个车位(长度1),货车占两个车位(长度2),卡车占三个车位(长度3)。 统计停车场最少可以停多少辆车,返回具体的数目。 输入描述 整型字符串数组c…...
![](http://static.blog.csdn.net/images/save_snippets.png)
南京做网站企业/广东seo
在浏览地图时,移动鼠标经过某个对象或者POI的时候,能够提示该对象的名称对用户来说是很实用的,本文讲述在Arcgis for Js中,用两种不同的方式来实现该效果。 为了有个直观的概念,先给大家看看实现后的效果: …...