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

news2024/9/20 7:56:19

文章目录

  • 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的应用配置的内容修改 null
  beforeAppConfig.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.xml
  type-aliases-package: com.superjson.superjsonmanager.mapper
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 按下划线转驼峰规则映射数据库字段与java bean属性之间的关系
    map-underscore-to-camel-case: true
    # 关闭一级缓存
    # local-cache-scope: statement
    # 关闭二级缓存
    # cache-enabled: false
  global-config:
    db-config:
      id-type: auto
      logic-delete-value: -1
      logic-not-delete-value: 0

如果没有配置这个属性,那么,MyBatis-Plus采用了默认的字段验证策略。

这个属性就是field-strategy,在原application.yml中加入该属性,如下代码所示:

global-config:
    #字段策略 0:忽略判断,1:非NULL判断,2:非空判断
    field-strategy: 1
    db-config:
      id-type: auto
      logic-delete-value: -1
      logic-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: 0
  db-config:
    id-type: auto
    logic-delete-value: -1
    logic-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. 总结

如果你不是使用上述方式解决了你的问题,欢迎在评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT学习心得一(使用node+react做了一个案例)

项目地址 http://chat.xutongbao.top 项目截图 使用技术栈 nodeSQLiteredisnginxlog4jsexpressjenkinscdnreactantdreact-scrollbars-customiconfontwebpackpostmanaxiosreduximmutablenpmyarnopenai等等 官网 https://openai.com/blog/chatgpt/ 官方聊天应用 https://ch…

【Linux】多线程编程 - 同步/条件变量/信号量

目录 一.线程同步 1.什么是线程同步 2.为什么需要线程同步 3.如何实现线程同步 二.条件变量 1.常见接口以及使用 2.wiat/signal中的第二个参数mutex的意义 3.代码验证 三.POSIX信号量 1.概念 2.常见接口以及使用 四.条件变量vsPOSIX信号量 一.线程同步 1.什么是线…

公链“私”用

发表时间:2022年3月17日 信息来源:bsvblockchain.org 虽然区块链行业已经诞生了十多年,但直到最近几年这个行业才开始走向专业化并日趋成熟,现在它已成为了一种可为企业实用范例提供合法解决方案的技术。 早年间,与这…

基于ubuntu20.4的wine的MDK5软件的安装

本文基于ubuntu20.4安装MDK5的keil软件,由于MDK不提供linux版本的安装软件,因此需要利用wine软件来安装MDK5软件,具体流程包括wine软件安装、MDK5安装及MDK5的lic添加等3部分内容。具体流程如下所示: (一)…

typescript 路径别名问题(别名设置 开发与打包时路径问题)

在使用TS开发时,一般我们会在tsconfig 中设置别名来让代码变得优雅一点。 将 import xx from …/…/…/service/改为import xx form ‘service/’ tsconfig 别名设置 此时项目结构如下 一般我们可以通过baseUrl 和path两个字段来设置对应的别名 {"include…

爬虫:栖落的电影网站,利用requests和re模块

这是栖落的电影网站地址:https://xxx.xxx 进入网页,显示: 爬取目标:电影的名称、观影人数和评分。 易知本网站的url url "https://xxx.xxx" 本网站会识别出headers中的python请求而拒绝访问,所以需要更改…

企业管理者不得不看!现在的大企业都是怎么做文档管理的?

最近有一位朋友问我:“如果是大型企业,文档该怎么管理?” 说实话,很多内部的CIO、CTO对这个问题都是束手无策。信息文件散乱、难以和内部的组织构架关联起来、查找困难、不同版本更新进度不一,确实存在一些管理上的难题…

【DSP视频教程】第11期:插补算法,曲线拟合丝滑顺畅,统计函数和基础函数加速实现,汇集SIMD,饱和和MAC乘累加应用实战(2023-02-12)

视频教程汇总帖:https://www.armbbs.cn/forum.php?modviewthread&tid110519 DSP视频教程有段时间没有更新了。 当前DSP库从CMSIS软件包里面独立出来,并且更新非常频繁,所以本期视频教程优先给大家简单介绍下新版DSP, 然后为…

物流运输管理系统源码:实现物流公司全链条管理

一套适用于物流公司的物流运输管理系统,涵盖物流公司内部从订单->提货->运单->配车->点到->预约->签收->回单->代收货款的全链条管理系统。 运行环境:Windows.NET4.0SQLSERVER2008R2 私信了解更多! 菜单功能&#…

灰色关联分析法详解及python实践

1. 关于灰色关联分析 1.1. 什么是灰色关联分析 灰色关联分析是指对一个系统发展变化态势的定量描述和比较的方法,其基本思想是通过确定参考数据列和若干个比较数据列的几何形状相似程度来判断其联系是否紧密,它反映了曲线间的关联程度。 在系统发展过…

亚马逊云科技携手滴普科技,打造数据智能新标杆

随着企业数字化转型的不断深入,数据对于业务的价值和重要性也逐渐凸显。越来越多企业意识到,只有不断提升底层数据基础平台的性能和能力,才能构建数据驱动的业务,增强企业核心竞争力。作为湖仓一体数据智能基础软件独角兽企业&…

python基础之变量

Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 1:什么是变量 变量指的…

纽扣电池上架亚马逊UL4200A检测项目流程

纽扣电池(button cell )也称扣式电池,是指外形尺寸象一颗小纽扣的电池,一般来说直径较大,厚度较薄。纽扣电池因体形较小,故在各种微型电子产品中得到了广泛的应用,直径从4.8mm至30mm&#xff0c…

腾讯云轻量应用服务器和云服务器CVM区别

腾讯云轻量级服务器和云服务器有什么区别?轻量级应用服务器和云服务器CVM哪个更好?无论成本和使用门槛如何,云服务器CVM都更好;从性价比和易用性的角度来看,轻量级应用服务器的成本更低。来详细谈谈腾讯云轻量级应用服…

LabVIEW项目或库文件已损坏

LabVIEW项目或库文件已损坏尝试打开项目文件(*.lvproj)时,不断收到错误:项目或库文件已损坏。当尝试在新计算机上打开类库时,看到错误内存或数据结构损坏。无法加载文件,但库在另一台计算机上打开正常。如何…

如何学习PMP?

★基础要打牢 方法:“基础不牢,地动山摇”,如果基础不牢那么就很难拿高分,因为连最基础的题目分都不一定能拿到。 可以在针对基础知识,把PMBOK看一两遍,再次加深印象,再把平时做章节练习、每日5…

Java导出自定义Excel表格,一套组合拳解决

🔵 (一) 功能现状 🍭目前大部分SpringBoot框架中自带了Excel导出功能,但其中并不支持自定义导出效果的可能性很大。比如很多框架中都能直接支持自动生成关于单表的增删改查操作的前后端代码,但是复杂的多表操作就无法做到&#xf…

c# winform错误大全

c# winform 错误大全为了实现安装包安装完成后,启动程序。System.BadImageFormatException: 未能加载文件或程序集“file:///C:\xxxxxxxxx\xxxxxxx.exe”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程The version of the …

软件功能测试包含了哪些测试项目?功能测试报告收费标准

一、软件功能测试是什么? 软件功能测试是测试人员通过执行功能测试用例逐步验证软件产品各项功能是否达到预期需求的测试过程。也是俗称的“点点点测试”,这是基础性的测试类型,软件产品的功能直接影响到用户体验,所以软件功能测试意义重大…

UDP的详细解析

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