S-mall-ssm 软删除实现全解析deleteAt字段与DeleteAtPlugin插件的前世今生【免费下载链接】S-mall-ssm小小商城系统JavaWEB项目基于SSM仿天猫页面功能齐全实现了自动处理关联查询的通用Mapper、抽象 BaseService 类、注解鉴权、参数注解校验等项目地址: https://gitcode.com/gh_mirrors/smal/S-mall-ssmS-mall-ssm 是一款基于 SSMSpring SpringMVC MyBatis框架、仿天猫页面的 JavaWeb 商城系统它的软删除实现非常值得新手学习项目没有使用一条DELETE语句而是靠每张表里的deleteAt 字段配合DeleteAtPlugin 插件实现了逻辑删除 查询自动过滤既保住了用户数据又让代码量降到最低。这篇文章就带你彻底看懂这套软删除方案的前世今生。什么是软删除为什么商城系统离不开它软删除逻辑删除指的是不真正从数据库里把记录删掉而是给记录打上一个已删除的标记。与之相对的物理删除才是我们熟悉的delete from 表 where id ...。在真实的商城系统里物理删除几乎是被禁止的订单、评论、商品等数据有法律与审计要求不能随意销毁删除订单后用户的历史消费记录、购物车关联数据会全部丢失误删数据无法恢复后果不可挽回。而软删除只需要一个标记字段让已删除的数据在业务层隐身数据库里仍然完好保存。S-mall-ssm 正是把这种设计发挥到了极致。deleteAt字段软删除的核心时间戳标记S-mall-ssm 的软删除思路非常简单粗暴每张业务表都增加一个deleteAt字段TIMESTAMP 类型。它的语义一目了然deleteAt NULL记录正常存活deleteAt 非空时间记录已被删除记录下删除时间。为了让所有实体类都能统一拥有这个字段项目定义了一个基类 BasePOJO.java里面只有两个属性id和deleteAt所有 MyBatis Generator 自动生成的 POJO 都继承它public class BasePOJO implements Serializable { private Integer id; private Date deleteAt; // getter / setter ... }这样无论商品、分类、订单还是评论天然都带上了软删除能力无需为每个实体重复编写字段。DeleteAtPlugin插件自动给查询注入过滤条件有了字段只是第一步难点在于如何保证所有查询都自动忽略已删除的数据如果每个 Service 都手动写where deleteAt is NULL既啰嗦又容易遗漏。S-mall-ssm 的答案是写了一个 MyBatis Generator 插件 DeleteAtPlugin.java。它拦截了代码生成过程中的两个关键节点sqlMapExampleWhereClauseElementGenerated生成Example_Where_Clause时自动追加上一行and deleteAt is NULL覆盖所有selectByExample列表查询sqlMapSelectByPrimaryKeyElementGenerated生成selectByPrimaryKey时同样自动加上and deleteAt is NULL覆盖主键单查。效果非常惊艳项目里每个 Mapper 的 XML 文件比如 ProductMapper.xml都自动长出了这行过滤条件你甚至不需要写一行额外代码where ... 原有条件 ... and deleteAt is NULL /where这也解释了为什么deleteAt这个字段会叫这个名字——它和插件配合得严丝合缝是整套软删除方案的地基。软删除如何落地BaseServiceImpl 里的 delete 方法查询已经被插件包办剩下的就是删除动作本身。在 BaseServiceImpl.java 中delete方法并不是执行删除 SQL而是把当前时间写入deleteAt然后走一次普通的updateByPrimaryKey更新Override public void delete(BasePOJO object) throws Exception { object.setDeleteAt(new Date()); mapper.updateByPrimaryKey(object); }至此一条完整的软删除闭环形成了业务层调用delete()只是给deleteAt打上时间戳数据库里记录依然存在随时可以恢复或审计由于所有查询 SQL 都被插件注入了and deleteAt is NULL这条记录从此在用户面前消失。与其他 MBG 插件的配合一套自动化生成体系DeleteAtPlugin并非孤立存在它属于 S-mall-ssm 自研的 MBG 插件族MBGPlugins同族的还有POJOExtendsPlugin让生成的 POJO 自动继承BasePOJO从而获得id与deleteAt字段ExampleExtendsPlugin让生成的 Example 自动实现BaseExample接口为通用 Mapper 服务MapperExtendsPlugin让 Mapper 继承BaseMapper统一 CRUD 行为。这些插件配合 MybatisGenerator.java 一键重新生成代码配合通用 MapperMapper.java 与 MapperFactory整个项目的持久层几乎可以做到改表即生成、生成即可用。软删除方案小结优点与注意点最后我们把这套软删除实现的优缺点梳理一下优点数据不丢失支持追溯与恢复符合电商审计需求通过插件在生成层统一注入条件开发时零负担所有实体共用BasePOJO字段命名、类型完全统一。注意点软删除数据会持续占用存储需要定期归档清理唯一索引场景下重复删除-新增同名数据可能冲突可考虑把deleteAt并入唯一键若绕过 Mapper 直接写原生 SQL记得手动补上deleteAt is NULL。如果你想亲手体验这套软删除实现可以 clone 项目后重点阅读util/MBGPlugins/DeleteAtPlugin.java、pojo/base/BasePOJO.java和service/impl/BaseServiceImpl.java三个文件配合生成后的 Mapper XML 一起看很快就能掌握一个字段 一个插件搞定软删除的精髓。希望这篇文章能帮你彻底读懂 S-mall-ssm 的软删除设计。如果你正在做自己的商城项目不妨也试试这套 deleteAt 字段 MBG 插件的组合拳真的非常省心。【免费下载链接】S-mall-ssm小小商城系统JavaWEB项目基于SSM仿天猫页面功能齐全实现了自动处理关联查询的通用Mapper、抽象 BaseService 类、注解鉴权、参数注解校验等项目地址: https://gitcode.com/gh_mirrors/smal/S-mall-ssm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考