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

逻辑删除 vs 物理删除:MyBatis-Plus 实现指南与实践

在日常开发中,删除操作是再常见不过的需求。
直接 DELETE FROM table 真的是最优解吗?
本文带你深入理解 逻辑删除物理删除 的适用场景,并手把手教你如何在 MyBatis-Plus 中正确实现逻辑删除 ✅


 一、删除方式对比:逻辑删除 vs 物理删除

类型含义是否可恢复适用场景
逻辑删除标记数据为“已删除”,不真正移除✅ 可恢复数据需保留、关联性强、审计要求高
物理删除从数据库中彻底删除记录❌ 不可恢复数据无关联、临时数据、归档清理

 二、何时使用逻辑删除?——以商品分类为例 🛍️

假设我们有一个商品分类表 category,当需要删除某个分类时,必须考虑以下两个问题:

1️⃣ 是否有商品正在使用该分类?

  • ✅ 如果有商品使用该分类
    •  不能直接删除(无论是逻辑还是物理);
    •  应先将相关商品下架或迁移至其他分类
    • 然后对该分类执行逻辑删除(标记为已删除)。

🌰 为什么选择逻辑删除?

  • 订单历史中仍需显示原分类信息(如“订单详情页”);
  • 避免因删除导致历史数据失真;
  • 支持未来“恢复分类”或数据分析。

2️⃣ 如果没有商品使用该分类?

  • 可以进行物理删除
  • 也可选择逻辑删除(便于后期复用或审计);
  • ⚠️ 建议:即使无关联,也优先考虑逻辑删除,除非有明确归档策略。

 三、MyBatis-Plus 中实现逻辑删除的正确姿势

✅ 步骤 1:添加 @TableLogic 注解

在实体类中标记逻辑删除字段(通常是 deleted 字段):

@TableLogic(value = "0", delval = "1")
private Integer deleted;
属性含义示例说明
value未删除时的值(正常状态)如 "0" 表示未删除
delval删除后的值(删除标记)如 "1" 表示已逻辑删除

💡 提示:具体值根据公司规范调整(如用 0/1N/Yfalse/true

✅ 步骤 2:配置全局逻辑删除规则(可选)

application.yml 中配置(推荐统一管理):

mybatis-plus:global-config:db-config:logic-delete-value: 1     # 逻辑已删除值logic-not-delete-value: 0 # 逻辑未删除值

配置后,实体上可省略 @TableLogicvalue/delval 参数。

四、通用删除接口实现注意事项

实现一个健壮的删除接口,需关注以下三个关键点:

1️⃣ 🔍 参数校验(防御性编程)

if (id == null || id <= 0) {throw new IllegalArgumentException("分类ID不能为空或非法");
}
  • 对 removeByIdremoveByIds 等方法,必须校验参数合法性;
  • 批量删除时还需校验 ids 列表是否为空。

2️⃣ 🔎 数据存在性校验

Category category = categoryService.getById(id);
if (category == null) {return Result.fail("分类不存在,无法删除");
}

✅ 为什么需要这一步?

  • 避免对不存在的数据操作,造成误判;
  • 提供清晰错误信息,提升用户体验;
  • 防止恶意请求探测 ID。

3️⃣ 🧩 执行逻辑删除

调用 MyBatis-Plus 提供的方法即可自动处理逻辑删除:

boolean success = categoryService.removeById(id);
  • 无需手动更新 deleted 字段;
  • MP 会自动将 deleted 从 0 改为 1
  • 查询时自动过滤 deleted=1 的数据(需开启自动过滤)。

✅ 建议:使用 Result 统一封装返回结果,告知前端操作是否成功

总结

场景推荐方案
有关联数据(如商品、订单)✅ 逻辑删除 + 先解耦
无关联、临时数据✅ 物理删除 or 逻辑删除(视业务)
审计/回溯需求强✅ 必须逻辑删除
高频删除、归档场景✅ 物理删除 + 归档机制

核心原则

  • 能不删就不删,能逻辑删就不物理删
  • 删除前必校验参数与存在性
  • 借助 MyBatis-Plus 自动化能力,减少手动干预

备注: 当处理的是临时数据,例如用户会话信息、验证码等短期内有效的数据时,一旦这些数据不再需要(比如会话过期),可以考虑进行物理删除。

http://www.dtcms.com/a/327198.html

相关文章:

  • 可泛化逻辑推理Python编程作为医疗AI发展方向研究
  • 关于数据库的restful api接口工具SqlRest的使用
  • 如何在 Ubuntu 24.04 LTS Linux 中安装 JSON Server
  • 2025年国赛新规解读:8-12最新发布文件
  • 初识数据结构——优先级队列(堆!堆!堆!)
  • 偶遇冰狐智能辅助的录音
  • Python初学者笔记第二十四期 -- (面向对象编程)
  • 教程 | 用Parasoft SOAtest实现高效CI回归测试
  • 从零到一的 Python CI/CD 实战指南:用 GitHub Actions 与 Jenkins 打造稳定、可持续交付的工程力
  • 下一代防火墙技术
  • 【ad-hoc 最小生成树 构造】P8957 「CGOI-3」巫泡弹弹乐|普及+
  • 【Redis在智能健身镜中的作用:运动指导与用户数据同步】
  • 计算机网络摘星题库800题笔记 第6章 应用层
  • 使用正则中的sub实现获取我们匹配的字符串,然后追加指定字符
  • 计算机网络---防火墙(Firewall)
  • pyside控件_左右范围滑动控件
  • 深层神经网络
  • torch.max() 函数使用
  • uv 配置和简单使用
  • 6深度学习Pytorch-神经网络--过拟合欠拟合问题解决(Dropout、正则化、早停法、数据增强)、批量标准化
  • OpenHarmony编译与烧录
  • 【完美解决】在 Ubuntu 24.04 上为小米 CyberDog 2 刷机/交叉编译:终极 Docker 环境搭建指南
  • 【LeetCode】2. 两数相加
  • 一台云主机“被黑”后的 24 小时排查手记
  • 【力扣 Hot100】刷题日记
  • 《Redis ACL验证流程:从用户认证到权限检查的完整步骤》
  • 【doris基础与进阶】3-Doris安装与部署
  • 模板打印技术——自动识别office类型 打印模板:为政务土地确权定制的替换利器—仙盟创梦IDE
  • Go 语言 里 `var`、`make`、`new`、`:=` 的区别
  • Python 标准库模块shutil