相关文章推荐
玩足球的大蒜  ·  现实·事件·寓言:重新发现“现实主义”--理 ...·  1 年前    · 
热情的日光灯  ·  以“高性价比”切入小型电动汽车市场:电动屋能 ...·  2 年前    · 
俊秀的熊猫  ·  花缘官方新版本-安卓iOS版下载-应用宝官网·  2 年前    · 
傻傻的甘蔗  ·  关于营口市辖区2023年贺岁普通纪念币分配计 ...·  2 年前    · 
难过的路灯  ·  奔驰EQS AMG售144.7万 ...·  2 年前    · 
Code  ›  全网详解MyBatis-Plus updateById方法更新不了空字符串或null的解决方法-天翼云
mysql创建表 content 天翼云
https://www.ctyun.cn/zhishi/p-261271
淡定的鸡蛋
1 年前

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 一键部署Llama3大模型学习机 0代码一键部署,预装最新主流大模型Llama3与StableDiffusion
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 云主机特惠 HOT 多款云主机新老同享,满足您的上云需求!
  • 推荐有礼 推荐新人实名注册有好礼,下单更得千元代金券!
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城 进入云市场
办公协同
  • WPS云文档 EMM手机管家 智能商业平台 SSL证书 新域名服务 翼电子教室 翼智慧显示一体化解决方案 税务风控云 翼信息化运维服务 翼视频云归档解决方案 云管家2.0 智慧工厂_生产流程管理解决方案 全栈混合云敏捷版(软件) 全栈混合云敏捷版(一体机)

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云技术合作伙伴
  • 天翼云OpenAPI中心 天翼云EasyCoding平台
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云培训认证
  • 天翼云学堂 天翼云市场商学院
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云合作计划
  • 央企云合作计划
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴 天翼云甄选商城合作伙伴
天翼云东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
资源与工具
  • 天翼云OpenAPI EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂 天翼云认证

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • OpenAPI中心 客户支持计划 专家技术服务

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云 天翼云4.0 天翼云APP 全球基础设施 分析师和白皮书 天翼云·创新直播间 2024智算云生态大会 2023云生态大会 2022云生态大会 天翼云中国行 支持与服务 了解天翼云
  • 站点切换
    • 中国站
  • 文档
  • 控制中心
  • 备案
  • 管理中心

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

首页 知识中心 数据库 文章详情页

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

2023-07-28 07:36:03 阅读次数:120

java, mybatis, mysql

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的应用配置的内容修改 null
  beforeAppConfig.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.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字段更新插入策略属性说明:

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: 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. 总结

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

版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/lvoelife/article/details/128997817,作者:互联网全栈开发实战,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

上一篇: mysql常用function

下一篇: Cause: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long错误的详细解决方法

相关文章

2024-08-01 09:05:13

使用Java代码获得本地文件的各种属性

使用Java代码获得本地文件的各种属性

2024-08-01 09:05:13
2024-08-01 09:05:13

一个Java实现的把指定字符串生成二维码并保存成图片的代码

一个Java实现的把指定字符串生成二维码并保存成图片的代码

2024-08-01 09:05:13
2024-08-01 09:05:04

Ian在北京做的CFCA的Java代码

Ian在北京做的CFCA的Java代码

2024-08-01 09:05:04
2024-07-31 08:42:26

rxjs fromEvent的源代码实现分析

rxjs fromEvent的源代码实现分析

2024-07-31 08:42:26
2024-07-31 08:42:26

一段统计双色球历史摇奖记录里每位出现次数的代码

一段统计双色球历史摇奖记录里每位出现次数的代码

2024-07-31 08:42:26
2024-07-31 08:42:26

用代码显示SAP CRM某个订单维护的长文本

用代码显示SAP CRM某个订单维护的长文本

2024-07-31 08:42:26
2024-07-29 08:02:08

初学Java,IO之使用FileInputStream和FileReader读取文件(四十一)

初学Java,IO之使用FileInputStream和FileReader读取文件(四十一)

2024-07-29 08:02:08
2024-07-29 08:02:08

Java面试题 -高并发、高可用、分布式

Java面试题 -高并发、高可用、分布式

2024-07-29 08:02:08
2024-07-29 08:02:08

初学Java,IO之使用FileOutputStream和FileWriter写入文件(四十二)

初学Java,IO之使用FileOutputStream和FileWriter写入文件(四十二)

2024-07-29 08:02:08
2024-07-25 09:09:58

Java阻塞式线程同步队列BlockingQueue,SynchronousQueue和TransferQueue

Java阻塞式线程同步队列BlockingQueue,SynchronousQueue和TransferQueue

2024-07-25 09:09:58
查看更多
推荐标签

作者介绍

天翼云小翼
天翼云用户

文章

23397

阅读量

2278700

查看更多

最新文章

MySQL常用函数汇总

2024-07-01 01:32:51

mysql备份与恢复

2024-06-28 06:18:44

字符串数值的比较 java

2024-06-28 06:18:15

go-mysql-server 新版本发布

2024-06-28 06:18:10

go 通过sql操作mysql

2024-06-28 06:18:10

mysql函数

2024-06-28 06:18:03

查看更多

热门文章

Windows下使用批处理实现启动关闭mysql

2023-04-24 11:27:05

Docker容器mysql创建表报错:Table ‘mybatis_plus.USER‘ doesn‘t exist 问题解决

2023-04-27 08:05:47

cdh安装到scm-server的mysql报错处理

2023-04-28 02:38:44

Nacos数据持久化到MySQL

2023-05-12 07:20:56

python学习——使用MySQL

2023-04-27 07:57:16

MySQL的间隙锁

2023-05-12 07:20:56

查看更多

热门标签

mysql MySQL redis oracle python linux leetcode Oracle
查看更多

相关产品

弹性云主机

随时自助获取、弹性伸缩的云服务器资源

天翼云电脑(公众版)

便捷、安全、高效的云电脑服务

对象存储

高品质、低成本的云上存储服务

云硬盘

为云上计算资源提供持久性块存储

查看更多

随机文章

取出一个实体中不为null的属性和属性值

mysql定时任务简单例子

记录mybatis添加表数据时报出的错误:Could not set property ‘id‘ of ‘class com.xxx.Manager with value ‘xx...xx‘

154-docker 安装mysql 区分大小写

MySQL----数据库概述

线性表练习之Example013-只用一个变量来求个位数字组成的正整数数组中的最小值

  • 7*24小时售后
  • 无忧退款
  • 免费备案
  • 专家服务
售前咨询热线
400-810-9889转1
  • 天翼云APP
    天翼云APP
 
推荐文章
玩足球的大蒜  ·  现实·事件·寓言:重新发现“现实主义”--理论评论--中国作家网
1 年前
热情的日光灯  ·  以“高性价比”切入小型电动汽车市场:电动屋能否突出重围? - 21经济网
2 年前
俊秀的熊猫  ·  花缘官方新版本-安卓iOS版下载-应用宝官网
2 年前
傻傻的甘蔗  ·  关于营口市辖区2023年贺岁普通纪念币分配计划的公告_营口市人民政府
2 年前
难过的路灯  ·  奔驰EQS AMG售144.7万 现车充足_太平洋汽车网
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号