当前位置: 首页 > news >正文

全网详解MyBatis-Plus updateById方法更新不了空字符串或null的解决方法

文章目录

  • 1. 文章引言
  • 2. 分析问题
  • 3. 解决问题
    • 3.1 方法1:全局配置方式
    • 3.2 方法2:非null字段验证策略
    • 3.3 方法3:通过注解的方式
  • 4. 总结

1. 文章引言

在开发的过程中,我们经常使用MyBatis-PlusupdateById方法更新数据表,但今天在更新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);虽然设置contentnull,但数据库并没有将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字段更新插入策略属性说明:

  1. IGNORED(0): “忽略判断”, 所有字段都更新和插入

  2. NOT_NULL(1):“非 NULL 判断”, 只更新和插入非NULL

  3. 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…...

龙虎榜——20250610

上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

<6>-MySQL表的增删查改

目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表&#xf…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

浅谈不同二分算法的查找情况

二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...