全网详解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. 总结
如果你不是使用上述方式解决了你的问题,欢迎在评论区留言。
相关文章:

全网详解MyBatis-Plus updateById方法更新不了空字符串或null的解决方法
文章目录1. 文章引言2. 分析问题3. 解决问题3.1 方法1:全局配置方式3.2 方法2:非null字段验证策略3.3 方法3:通过注解的方式4. 总结1. 文章引言 在开发的过程中,我们经常使用MyBatis-Plus的updateById方法更新数据表,…...

联想K14电脑开机全屏变成绿色无法使用怎么U盘重装系统?
联想K14电脑开机全屏变成绿色无法使用怎么U盘重装系统?最近有用户使用联想K14电脑的时候,开机后桌面就变成了绿色的背景显示,无法进行任何的操作。而且通过强制重启之后还是会出现这个问题,那么这个情况如何去进行系统重装呢&…...

Spring Boot HTTP 400排查
背景 前段时间朋友咨询他们公司某个HTTP接口偶现400错误,有没有什么好的分析方法和解决方案,使用的是Spring Cloud体系。最近有时间总结下这个问题的处理过程。 为了分析问题,笔者使用 Spring Boot 3.0.2还原报错场景进行讲解。 问题分析 …...
【手撕源码】vue2.x中keep-alive源码解析
🐱 个人主页:不叫猫先生 🙋♂️ 作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门…...

ROS2机器人编程简述humble-第四章-BASIC DETECTOR .3
书中程序适用于turtlebot、husky等多种机器人,配置相似都可以用的。支持ROS2版本foxy、humble。基础检测效果如下:由于缺¥,所有设备都非常老旧,都是其他实验室淘汰或者拼凑出来的设备。机器人控制笔记本是2010年版本。…...

【图像分类】基于PyTorch搭建LSTM实现MNIST手写数字体识别(双向LSTM,附完整代码和数据集)
写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 在https://blog.csdn.net/A…...

【Linux】多线程编程 - 同步/条件变量/信号量
目录 一.线程同步 1.什么是线程同步 2.为什么需要线程同步 3.如何实现线程同步 二.条件变量 1.常见接口以及使用 2.wiat/signal中的第二个参数mutex的意义 3.代码验证 三.POSIX信号量 1.概念 2.常见接口以及使用 四.条件变量vsPOSIX信号量 一.线程同步 1.什么是线…...
ES优化方案
ES优化&联合HBASE: 【Elasticsearch】优秀实践-ESHbase的实现_少加点香菜的博客-CSDN博客_sceshbase ES写入性能优化方案 ElasticSearch 调优笔记_index.refresh_interval_六月飞雪的博客-CSDN博客 es如何提升写入性能_婲落ヽ紅顏誶的博客-CSDN博客_es写入性…...

从数据备份保护到完整生命周期管理平台,爱数全新发布 AnyBackup Family 8
编辑 | 宋慧 出品 | CSDN 云计算 从2003年创业,开始做数据备份技术,爱数已经走过了近20年的时间。现在,数据的价值被越来越多的业界与用户看到,数据分析应用赛道近年一直持续火热。而现在的爱数在做的,已经从数据的备…...

Go 微服务开发框架 DMicro 的设计思路
Go 微服务开发框架 DMicro 的设计思路 DMicro 源码地址: Gitee:dmicro: dmicro是一个高效、可扩展且简单易用的微服务框架。包含drpc,dserver等 背景 DMicro 诞生的背景,是因为我写了 10 来年的 PHP,想在公司内部推广 Go, 公司内部的组件及 rpc 协议都…...
浅谈功能测试
1.功能测试流程 1.1 功能测试流程 # 功能测试大致按照以下流程进行: (1).需求分析与评审(2).测试计划与测试方案(3).测试用例设计(4).测试用例评审(5).执行用例(6).缺陷跟踪及报告产出 1.2 功能测试流程详解 (1).需求分析与评审 功能测试应从需求出发, 功能测试就是尽量覆…...

UDP的详细解析
UDP的详细解析 文章目录UDP的详细解析UDP 概述UDP的首部格式检验和的计算抓包测试参考TCP/IP运输层的两个主要协议都是互联网的正式标准,即:用户数据报协议UDP (User Datagram Protocol)传输控制协议TCP (Transmission Control Protocol) 按照OSI的术语…...

史上最详细JUC教程之Synchronized与锁升级详解
在Java早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的Mutex Lock来实现的,挂起线程和恢复线程都需要转入内核态去完成,阻塞或唤醒一个Java线程需…...

Vue|初识Vue
Vue是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助开发者高效地开发用户界面。 初识Vue1. Vue简介2. 开发准备3. 模板语法3.1 差值语法3.2 指令语法4. 数据绑定4.1 单向数据…...

在职阿里6年,一个29岁女软件测试工程师的心声
简单的先说一下,坐标杭州,14届本科毕业,算上年前在阿里巴巴的面试,一共有面试了有6家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少)其中成功的有4家&…...

(C语言)自定义类型,枚举与联合
问:1. 结构体在自引用的时候不能怎么样?可以怎么样?2. Solve the problems:自定义一个学生结构体类型,要包含姓名,性别,年龄,六科成绩,家乡(也为结构体&#…...
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…...

初始C++(三):引用
文章目录一.引用的概念二.引用的使用1.引用作为输出型参数2. 引用作为函数返回值3.const引用三.引用的一些小问题四.引用和指针五.引用和指针的区别一.引用的概念 引用的作用是给一个已经存在的变量取别名,编译器不会为引用变量开空间,引用变量和被他引…...

【前端】参考C站动态发红包界面,高度还原布局和交互
最近有些小伙伴咨询博主说前端布局好难,其实都是熟能生巧! 模仿C站动态发红包界面,cssdiv实现布局,纯javascript实现交互效果 目录 1、界面效果 2、界面分析 2.1、整体结构 2.2、标题 2.3、表单 2.4、按钮 3、代码实现 3.…...

VR全景带你浪漫“狂飙”情人节,见证甜蜜心动
当情人节遇上VR,足以让情侣过一个难忘的情人节。马上情人节就要到了,大家是不是还在绞尽脑汁的想着,如何和另一半过一个浪漫的情人节呢?老套的剧情已经不能吸引人了,让我们看看VR全景给情人节带来了哪些不同的体验吧&a…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...