当前位置:

首页 > 编程开发 > Mybatis Plus字段为空值时未更新问题及解决

Mybatis Plus字段为空值时未更新问题及解决

MyBatisPlus更新时空字段未更新问题可通过三种方式解决。使用@TableField注解的fill属性可指定字段更新策略;全局配置update-strategy为IGNORED可使所有字段更新时忽略空值判断;利用UpdateWrapper可动态构造更新语句,精确控制单次操作的更新字段。开发者可根据具体场景选择合适方案。

在使用MyBatis Plus进行开发时,不少开发者会遇到一个典型问题:调用updateById()方法时,明明从前台传入的某个字段值为空(null或空字符串),但执行后数据库里该字段却没有被更新,仍然保持着旧值。这让人不禁疑惑,以前用原生MyBatis时,生成的更新方法通常会判断值是否为空,为空则不拼接到SQL语句中。那么,MyBatis Plus作为一款增强工具,是否也提供了类似@TableField、@TableId这样的注解来解决这个问题呢?

方案一:注解方式

答案就在@TableField注解里。仔细查看这个注解的属性,你会发现一个名为fill的字段,它专门用来定义字段自动填充策略。

属性 类型 必填 默认值 描述
fill Enum 否 FieldFill.DEFAULT 字段自动填充策略

这个策略决定了在执行插入(insert)或更新(update)操作时,被注解的字段该如何处理。FieldFill枚举提供了几种选项:

值 描述
DEFAULT 默认不处理
INSERT 仅在插入时填充字段
UPDATE 仅在更新时填充字段
INSERT_UPDATE 在插入和更新时都填充字段

问题的关键就在于默认值DEFAULT。它意味着“不处理”,这正是导致我们开头所述问题的原因——当字段值为空时,MyBatis Plus默认不会将其纳入更新语句。生成的SQL可能像这样:

update shop_item set shop_price = ? where id = ?;
-- 而如果shop_price传入的是null或空字符串,这个set子句可能就不会被加入。

那么,如何解决呢?我们可以在实体类的对应字段上,通过fill属性明确指定更新时的策略。看一个例子:

@Data
@TableName("shop_item")
public class ShopItem implements Serializable {
 
    private static final long serialVersionUID = 1L;
 
    /**
     * 编号
     */
    @TableId(type= IdType.INPUT)
    private String id;
 
    /**
     * 物品名称
     */
    private String itemName;
 
    /**
     * 物品价格
     */
    @TableField(fill = FieldFill.UPDATE)
    private Double itemPrice;
 
    /**
    *    添加人编号
    */
    private String addUserId;
 
    /**
    *    添加时间
    */
    private Date addTime;
}

我们在itemPrice属性上添加了@TableField(fill = FieldFill.UPDATE)。这等于告诉MyBatis Plus:“在执行更新操作时,请务必处理这个字段,即使它传进来的是空值。”这样一来,执行的SQL就会包含这个字段了:

update 
    shop_item 
set 
    item_name = 'iPhone',
    item_price = '' -- 注意,这里即使传入空值也会被拼接到SQL中
where 
id = '361E8C48-6699-4ED5-83C4-7C9D98747C2C';

当然,这里需要配套实现一个MetaObjectHandler来定义具体如何“填充”这个空值(例如,是设置为null,还是某个默认值),但这已属于另一个话题——字段自动填充机制。本方案的核心在于利用fill属性让字段参与更新过程。

方案二:全局配置

除了在单个字段上注解,MyBatis Plus还提供了全局配置的方式。这涉及到FieldStrategy的三种策略:IGNORED(忽略判断,始终更新)、NOT_NULL(非NULL则更新)、NOT_EMPTY(非空则更新)。

你可以在项目的application.yml(或application.properties)配置文件中,通过修改全局配置来改变默认的更新策略:

# yml 配置:
mybatis-plus:
  global-config:
    db-config:
      update-strategy: IGNORED

将update-strategy设置为IGNORED后,全局所有字段在执行更新时都会忽略空值判断,即空值也会被更新到数据库。这种方法的好处是一劳永逸,省去了为每个字段添加注解的麻烦。

但需要注意的是,全局配置的影响范围也是全局的。如果你只是某些特定字段需要更新空值,而其他字段希望保持非空才更新的逻辑,那么全局配置可能就不太合适。此时,你依然可以在特定字段上使用@TableField注解来覆盖全局策略。

方案三:使用 UpdateWrapper 进行更新

如果你觉得修改实体类注解或全局配置的影响面太大,那么UpdateWrapper或许是一个更灵活、更精细的选择。这是MyBatis Plus 3.x版本中提供的一个强大工具。

查看BaseMapper的update方法签名:

/**
 * 根据 whereEntity 条件,更新记录
 *
 * @param entity        实体对象 (set 条件值,可以为 null)
 * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
 */
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper updateWrapper);

关键点在于,这里的entity参数可以为null,而更新字段可以通过UpdateWrapper来动态指定。这给了我们两种实现思路:

  • 将需要更新的字段及其新值,通过set方法设置到UpdateWrapper中。
  • 或者,将需要更新的字段设置到entity对象里,再传入UpdateWrapper构建查询条件。

使用Lambda表达式,代码可以写得非常清晰:

// 示例:将id为2的用户的age更新为3,name更新为"mp",同时将email明确更新为null
mapper.update(
    null, // 实体对象设为null,所有更新字段通过wrapper指定
    Wrappers.lambdaUpdate()
       .set(User::getAge, 3)
       .set(User::getName, "mp")
       .set(User::getEmail, null) // 明确将email字段更新为null
       .eq(User::getId, 2)
);

这种方法的最大优点是影响范围最小,完全在方法级别控制。你可以精确地决定本次更新要包含哪些字段,以及它们的值是什么,完全不受实体类注解或全局配置的约束。对于处理一些特殊的、一次性的更新逻辑非常有用。

总结

面对MyBatis Plus中空字段不更新的问题,我们实际上有三个层次的解决方案:

  1. 注解方式(@TableField):最为精准,在实体字段级别控制更新行为,适合对特定字段有明确更新策略的场景。
  2. 全局配置:最为便捷,通过配置文件一键修改所有字段的默认更新策略,适合项目整体策略统一的场景,但要注意其全局影响力。
  3. UpdateWrapper方式:最为灵活,在代码中动态构造更新语句,可以精确控制单次操作的更新字段,适合复杂或临时的更新逻辑。

在实际开发中,可以根据具体的业务需求、团队规范和场景复杂度,选择最合适的一种或组合使用。理解每种方案背后的机制,能帮助我们在遇到类似问题时,更加游刃有余地找到最佳实践。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
联想 Tab Plus Gen 2 平板海外开售:12.1 英寸屏幕、JBL 九单元扬声器
联想 Tab Plus Gen 2 平板海外开售:12.1 英寸屏幕、JBL 九单元扬声器

联想TabPlusGen2海外上市,12.1英寸2.5K120HzIPS屏,天玑7400芯片,后盖集成JBL九单元扬声器及杜比全景声,圆形支架可自立,内置10200mAh电池+45W快充,预装Android16,8+128GB约3367元。

酷态科6月24日推出神秘新品,有望为“CP模块风扇Plus”底座
酷态科6月24日推出神秘新品,有望为“CP模块风扇Plus”底座

酷态科6月24日将推出CP模块风扇Plus磁吸底座,通过Power-Pin接口使风扇支持充放电。风扇搭载30000RPM无刷电机,风速11m/s,内置双5000mAh电池,续航37小时,支持33W快充。

酷态科官宣 6 月 24 日推出神秘新品,有望为“CP 模块风扇 Plus”桌面底座
酷态科官宣 6 月 24 日推出神秘新品,有望为“CP 模块风扇 Plus”桌面底座

酷态科6月24日将推出神秘新品,有望为CP模块风扇Plus的桌面底座。该风扇采用30000RPM电机,风速达11m/s,内置两块5000mAh电池,续航37小时,支持充放电及主流快充协议。新品或使风扇兼具吹风与充电功能。

首创“证据锚定”技术,百川智能发布 M3 Plus
首创“证据锚定”技术,百川智能发布 M3 Plus

百川智能发布医疗大模型Baichuan-M3Plus,事实性幻觉率降至2.6%,创下全球最低纪录。首创“证据锚定”技术,实现医学结论可验证、可追溯。多项国际评测中超越GPT-5.2等领先模型,API调用成本较前代下降70%,性能表现卓越,堪称行业里程碑。

联想Tab Plus 2代发布:9扬声器+10200mAh大电池
联想Tab Plus 2代发布:9扬声器+10200mAh大电池

联想TabPlus2代在韩国发布,搭载联发科天玑7400芯片,12.1英寸120Hz600尼特屏幕,9个JBL扬声器支持杜比全景声和蓝牙音箱模式。内置10200mAh电池,预装安卓16,承诺升级至安卓18。配备联想AI实时转写、智能阅读和AI笔记等功能。

戴尔推出2026款灵越Plus 16英寸笔记本,7004元起
戴尔推出2026款灵越Plus 16英寸笔记本,7004元起

全新戴尔2026款灵越Plus16英寸笔记本正式发布,其搭载酷睿Ultra5-225U处理器,性能强劲,起售价为7004元,可享受国家补贴后最低仅需5698元。机身重1.94千克,配备1920×1200分辨率60HzIPS屏幕,接口含雷电4、HDMI2.1和RJ45网口,且扩展性强,非常适合办公与学习。

券后184.3元,酷态科CP模块风扇Plus曜石黑配色开售
券后184.3元,酷态科CP模块风扇Plus曜石黑配色开售

酷态科今天正式开售了CP模块风扇Plus的「曜石黑」版本,定价199元。电商平台上的券后价格大概在184.3元,有兴趣的可以留意一下。 这款新品最大的亮点就是模块化可扩展设计,内部搭载一颗30000 RPM的新一代高速三相无刷电机,技术原理和高速吹风机用的电机类似。实测风速最高能到11m/s,配合T

券后 184.3 元,酷态科 CP 模块风扇 Plus 曜石黑配色开售
券后 184.3 元,酷态科 CP 模块风扇 Plus 曜石黑配色开售

酷态科CP模块风扇Plus曜石黑配色正式开售,到手价仅184.3元。搭载30000RPM高速三相无刷电机与涡流增压技术,最大风速可达11m/s。内置两块5000mAh电池,续航时间长达37小时,支持33W输出及多种快充协议,还可当作移动电源使用。

中兴畅行70 Plus手机发售:展锐T9100 + 8G + 256G售2099元
中兴畅行70 Plus手机发售:展锐T9100 + 8G + 256G售2099元

中兴畅行70Plus已正式发售,定价为两千零九十九元,搭载了展锐T9100处理器、8GB运存与256GB存储。配备了6.75英寸120Hz高刷新率LCD打孔屏,内置了6050mAh大容量电池并支持45W快充,后置了一千三百万像素主摄,还提供了AI键、红外遥控及无网通信功能。

如何使用SQLPlus进行数据库管理
如何使用SQLPlus进行数据库管理

SQLPlus 是 Oracle 数据库的一个命令行工具,用于执行 SQL 查询、PL/SQL 程序以及管理数据库。以下是一些基本的 SQLPlus 命令和用法,用于数据库管理:开启SQLPlus:打开命令行界面(在Windows系统上为CMD或PowerShell,在Unix/Linux系统上为T

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

Android Studio Windows版
Android Studio Windows版
Windows

Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,