Java中级项目如何实现软删除机制_Java数据标记设计解析

发布时间 - 2025-12-26 00:00:00    点击率:
Java中级项目软删除核心是用状态字段替代物理删除,通过标记(is_deleted)和筛选(统一过滤)实现数据可追溯与恢复;数据库加tinyint字段及索引,MyBatis-Plus用@TableLogic自动拦截,服务层提供软删/强制删双接口并统一处理关联查询。

Java中级项目中实现软删除,核心是用状态字段替代物理删除,既保留数据完整性,又满足业务可追溯、可恢复的需求。关键不在“删”,而在“标”和“筛”——标记删除状态,并在所有数据访问层统一过滤。

数据库层面:添加逻辑删除字段

在对应表中增加一个非空的整型或布尔字段(推荐使用tinyint(1)smallint),如`is_deleted``status`。不建议用boolean类型(MySQL中实际存为TINYINT),避免ORM映射歧义。

  • `is_deleted TINYINT(1) DEFAULT 0 COMMENT '0-未删除,1-已删除'`
  • 配合添加普通索引:`INDEX idx_is_deleted (is_deleted)`,提升查询性能
  • 已有表迁移时,执行`ALTER TABLE xxx ADD COLUMN is_deleted TINYINT(1) DEFAULT 0`,并补全历史数据默认值

实体类与ORM映射:声明逻辑删除标识

以MyBatis-Plus为例,直接在实体字段上加@TableLogic注解,框架会自动识别并拦截CRUD行为:

private Long id;
private String name;
@TableLogic
private Integer isDeleted; // 值为0/1,MP默认0=未删,1=已删

若用原生MyBatis,需手动在每个语句末尾追加AND is_deleted = 0;更新时用UPDATE ... SET is_deleted = 1 WHERE id = ? AND is_deleted = 0确保幂等性。

服务层与接口设计:统一拦截与显式控制

软删除不是“藏起来”,而是有意识地暴露操作意图:

  • 提供两个独立接口:deleteById(Long id)(执行软删除)和forceDeleteById(Long id)(仅限管理员,走物理删除)
  • 列表查询默认只查is_deleted = 0的数据;如需查含已删数据(如回收站),显式传参includeDeleted = true,并在Service中分支处理
  • 关联查询(如订单+订单项)时,主表和从表都需加软删除条件,避免“半删”数据污染结果

全局过滤与扩展考虑

为降低遗漏风险,可借助MyBatis-Plus的MetaObjectHandler自动填充创建/更新时间及删除状态;对复杂场景(如多状态生命周期),可用status字段替代is_deleted,定义枚举:NORMAL(0), DELETED(1), DISABLED(2),再配合@TableField(fill = FieldFill.INSERT)和逻辑删除插件协同工作。


# mysql  # java  # 数据访问 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  微信h5制作网站有哪些,免费微信H5页面制作工具?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  ,网页ppt怎么弄成自己的ppt?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  如何获取免费开源的自助建站系统源码?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  如何快速搭建支持数据库操作的智能建站平台?  如何用y主机助手快速搭建网站?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  iOS UIView常见属性方法小结  Laravel如何实现文件上传和存储?(本地与S3配置)  网站制作软件有哪些,制图软件有哪些?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  如何用腾讯建站主机快速创建免费网站?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  LinuxCD持续部署教程_自动发布与回滚机制  高性能网站服务器部署指南:稳定运行与安全配置优化方案  黑客如何利用漏洞与弱口令入侵网站服务器?  Java类加载基本过程详细介绍  如何在阿里云购买域名并搭建网站?  音响网站制作视频教程,隆霸音响官方网站?  英语简历制作免费网站推荐,如何将简历翻译成英文?  Angular 表单中正确绑定输入值以确保提交与验证正常工作  深入理解Android中的xmlns:tools属性  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  香港服务器如何优化才能显著提升网站加载速度?  5种Android数据存储方式汇总  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  如何快速选择适合个人网站的云服务器配置?  Laravel如何为API生成Swagger或OpenAPI文档  MySQL查询结果复制到新表的方法(更新、插入)  Laravel模型事件有哪些_Laravel Model Event生命周期详解  想要更高端的建设网站,这些原则一定要坚持!