1. 逻辑删除:不只是“删除”,更是数据安全的守护者
大家好,我是老张,一个在Java后端摸爬滚打了十多年的老码农。今天想和大家聊聊一个在业务系统里几乎避不开,但又常常被简单处理的话题:数据删除。你是不是也遇到过这样的场景?用户跑来跟你说:“哎呀,我不小心把那条订单删了,能帮我找回来吗?”或者产品经理提需求:“我们需要一个回收站功能,用户删掉的东西可以自己恢复。”这时候,如果你当初用的是物理删除(DELETE FROM table WHERE id = ?),那场面可就尴尬了,只能挠着头说:“数据…已经彻底没了。”
这就是为什么我们需要逻辑删除。逻辑删除,说白了,就是一种“假删除”。它并不是真的把数据从数据库里抹掉,而是在数据表里增加一个标志字段(比如叫 is_deleted),当用户执行“删除”操作时,我们只是把这个标志从“0”(正常)改成“1”(已删除)。数据本身还好好地躺在数据库里,只是后续的查询默认会过滤掉这些“已删除”的数据。这就像把文件扔进了电脑的回收站,而不是直接按 Shift + Delete 清空。
在 MyBatis-Flex 这个高性能的 MyBatis 增强框架里,实现逻辑删除变得异常简单和优雅。它通过几个核心的注解和工具类,把这种“删除即隐藏”的理念封装得非常好,让我们开发者可以专注于业务,而不用反复编写那些过滤条件。我刚开始用的时候,感觉就像发现了一个宝藏,以前需要手动在每一个查询后面加 AND is_deleted = 0 的日子一去不复返了。更重要的是,它为后续的数据恢复、审计追踪乃至构建完整的回收站体系,打下了坚实的基础。接下来,我就结合自己踩过的坑和总结的经验,带你彻底玩转 MyBatis-Flex 的逻辑删除与数据恢复。
2. 快速上手:5分钟配置你的第一个逻辑删除字段
理论说再多,不如动手试一下。我们来看看怎么用 MyBatis-Flex 最快地给一个实体类加上逻辑删除能力。假设我们有一个最经典的 Account(账户)实体,对应数据库的 tb_account 表。
2.1 核心注解:@Column(isLogicDelete = true)
MyBatis-Flex 的逻辑删除功能,核心就靠实体类字段上的一个注解:@Column(isLogicDelete = true)。你只需要在想要作为删除标志的字段上加上它,框架就会自动接管后续的所有魔法。
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
@Table("tb_account")
public class Account {
@Id
private Long id;
private String userName;
private Integer age;
// 关键在这里:声明这是一个逻辑删除字段
@Column(isLogicDelete = true)
private Integer isDeleted;
// 省略 getter/setter 和 toString
}
就这么简单!我当初看到这个配置时,心里直呼“优雅”。你不需要在 XML 里写复杂的 SQL 片段,也不需要继承某个特定的父类。这个 isDeleted 字段在数据库里通常是一个 tinyint 类型,默认值为 0。0 代表数据正常,1 代表数据已被逻辑删除。这个默认值(0和1)是 MyBatis-Flex 的全局配置,如果你公司的习惯是 false/true 或者 Y/N,也可以通过 FlexGlobalConfig 进行自定义,这个我们后面会提到。
配置好后,当你调用 BaseMapper 的 deleteById(1) 方法时,神奇的事情发生了。框架不会执行 DELETE FROM tb_account WHERE id = 1,而是会智能地生成一条更新语句:UPDATE tb_account SET is_deleted = 1 WHERE id = 1 AND is_deleted = 0。看到了吗?它甚至加了一个 AND is_deleted = 0 的条件,防止重复“删除”已经删除的数据,这个细节非常贴心。
2.2 自动生效的查询过滤
配置好逻辑删除字段后,最大的好处在查询时体现。所有通过 MyBatis-Flex BaseMapper 进行的查询,都会自动带上 AND is_deleted = 0 这个条件。
// 假设id为1的记录已被逻辑删除(is_deleted=1)
Account account = accountMapper.selectOneById(1);
System.out.println(account); // 输出:null
// 查询年龄大于18的账户,结果中会自动排除已逻辑删除的
List<Account> list = accountMapper.selectListByQuery(QueryWrapper.create()
.where(ACCOUNT.AGE.ge(18)));
// 生成的SQL: SELECT * FROM tb_account WHERE age >= 18 AND is_deleted = 0


340

被折叠的 条评论
为什么被折叠?



