news 2026/4/12 12:31:10

Mybatis-Plus更新操作时的一个坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Mybatis-Plus更新操作时的一个坑

Mybatis-Plus更新操作时的一个坑

在 MyBatis-Plus开启逻辑删除 的情况下,updateById更新逻辑删除字段时, “看起来执行了但实际上没有更新”的问题是一种较为常见但不易察觉的问题。

背景:

项目中使用mybatis-plus且已开启逻辑删除:

1 mybatis-plus:

2 global-config:

3 db-config:

4 logic-delete-field: deleted

5 logic-delete-value: 1

6 logic-not-delete-value: 0

7 update-strategy: not_empty #更新策略只更新非空

在代码中获取记录并更新逻辑删除字段:

1 useRecord record = RecordMapper.selectOne(...);

2 record.setDeleted(1);

3 RecordMapper.updateById(record);

执行结果没有明显报错,也不会有异常日志,但实际没有更新逻辑删除字段。

如果没有记录执行返回值进行判断,将导致逻辑删除失败问题被隐藏,为后续业务埋雷。

原因分析:

mybatis-plus使用逻辑删除背景下,使用updateById时,如下代码段:

1 record.setDeleted(1);

2 RecordMapper.updateById(record);

执行的sql语句是:

1 UPDATE table_name

2 SET deleted = 1

3 WHERE id = ?

4 AND deleted = 0; -- ⚠️ MyBatis-Plus 自动添加的条件

这条 SQL 在语法层面是合法的,但在 MyBatis-Plus 的设计语义中,逻辑删除并不被视为一次普通的 update 操作。

MyBatis-Plus 将“删除”与“更新”在内部逻辑上进行了区分:updateById 被设计为只能作用于“未被逻辑删除的数据”,而逻辑删除本身应通过 delete 系列方法触发。

1 -- 你期望生成的SQL(框架不会生成)2 UPDATE record SET deleted = 1 WHERE id = ? AND deleted = 0;

3

4 -- updateById实际生成的SQL(deleted字段被剔除)5 UPDATE record SET other_field=? WHERE id = ? AND deleted = 0;

Mybatis-Plus为什么要这样设计:

MyBtis-Plus 遵循 "语义隔离" 原则

操作类型 框架方法 SQL语义 设计意图

业务更新 updateById() 修改业务字段 只改数据内容,不改数据状态

逻辑删除 deleteById() UPDATE ... SET deleted=1 标记数据为"已删除"状态

关键机制:

拦截器过滤:LogicDeleteInterceptor 会自动移除 SET 子句中的逻辑删除字段

条件追加:所有查询/更新操作都会自动追加 AND deleted = 0

单向操作:逻辑删除被视为不可逆操作(删除后不应通过业务代码恢复)

如何正确处理:

使用 MyBatis-Plus 提供的 deleteById 进行逻辑删除

1 // 框架会自动生成:UPDATE user SET deleted=1 WHERE id=? AND deleted=02 recordMapper.deleteById(1L);

在开启逻辑删除的前提下,deleteById 不会执行物理删除,而是由 MyBatis-Plus 自动生成逻辑删除 SQL,其语义与框架设计完全一致。

用 LambdaUpdateWrapper 显式执行逻辑删除

1 // 手动指定SET子句,绕过字段过滤

2 LambdaUpdateWrapper<Record> wrapper = new LambdaUpdateWrapper<>();

3 wrapper.eq(Record::getId, 1L).set(Record::getDeleted, 1); // 强制设置deleted字段

4 recordMapper.update(n

ull, wrapper);

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/28 17:28:49

网络问题如何排查?mtr命令详解

网络问题如何排查&#xff1f;mtr命令详解mtrmtr命令是一个网络诊断工具&#xff0c;用于检测网络的连通性和延迟。MTR是My Traceroute的缩写&#xff0c;是traceroute和ping命令的结合体。mtr默认使用ICMP协议&#xff0c;在介绍mtr的详细用法前我们先了解下ICMP协议。IMCPICM…

作者头像 李华
网站建设 2026/4/12 0:46:14

踩下油门时混合动力车的能量分配就像打扑克——既要看当前手牌,也得算后面几步。模型预测控制(MPC)在这局游戏里当起了军师,今天咱们就拆解这背后的骚操作

模型预测控制&#xff08;MPC&#xff09;在混合动力汽车能量管理策略开发上的运用。 [1]利用车速预测模型&#xff08;BP或者RBF神经网络&#xff0c;预测模型资料也有发在其他链接&#xff09;根据预测的信息对车辆进行优化控制&#xff0c;可以对混动汽车的能量管理具有一定…

作者头像 李华
网站建设 2026/4/4 21:25:16

100kW微型燃气轮机Simulink建模探索

100kW微型燃气轮机Simulink建模&#xff0c;微燃机包括压缩机模块、容积模块、回热器模块、燃烧室模块、膨胀机模块、转子模块以及控制单元模块。 考虑微燃机变工况特性下的流量、压缩绝热效率、膨胀绝热效率、压缩比、膨胀比等参数的变化&#xff0c;可以观察变负载情况下微燃…

作者头像 李华
网站建设 2026/4/11 4:48:14

基于深度学习神经网络YOLOv4目标检测的汽车车牌识别系统

第一步&#xff1a;YOLOv4介绍 YOLOv4是一种目标检测算法&#xff0c;它在精度和速度之间取得了最佳的平衡。它是YOLO&#xff08;You Only Look Once&#xff09;系列算法的最新版本&#xff0c;通过将目标检测任务转化为一个回归问题&#xff0c;实现了实时目标检测。YOLOv4…

作者头像 李华
网站建设 2026/4/4 8:51:32

【测试人生】一套灵活的变更风险观测策略匹配机制设计

近期笔者在投入变更风险防控开放平台的额外功能开发&#xff0c;目的是希望设计一套更加灵活的变更风险观测策略匹配机制&#xff0c;能够在满足面向任意变更场景应用观测策略的同时&#xff0c;尽可能保证产品体验&#xff0c;让用户清晰地了解到自己配置的什么策略能够在什么…

作者头像 李华
网站建设 2026/4/11 21:41:39

基于贾子智慧理论体系的 AI 未来发展核心观点深度解构

智慧升维&#xff1a;基于贾子智慧理论“万物统一本质规律”的AI革命与文明跃迁深度解构摘要&#xff1a; 本报告以贾子智慧理论&#xff08;KWF&#xff09;“万物统一本质规律”为基石&#xff0c;运用“势-道-术”三层逻辑&#xff0c;深度解构AI对职业、经济、技术、能源及…

作者头像 李华