MyBatis-Flex 逻辑删除与自动更新的实战技巧

1. 从物理删除到逻辑删除:为什么我们需要它?

大家好,我是老张,一个在Java后端摸爬滚打了十来年的老码农。今天想和大家聊聊一个在数据库操作中非常经典,但又常常被新手忽略的话题:逻辑删除。你可能已经用过MyBatis-Flex,或者正在考虑用它,那今天分享的实战技巧,特别是关于逻辑删除和自动更新时间的结合使用,绝对能让你在实际项目中少踩几个坑。

先说说什么是逻辑删除。想象一下,你负责一个电商后台,用户下了单又取消,或者管理员误删了一条商品记录。如果直接用DELETE FROM语句把数据从数据库里物理抹掉,那后果是什么?数据找不回来了,用户可能投诉,老板可能找你谈话。更麻烦的是,这条数据可能关联着订单、日志等其他数据,物理删除很容易破坏数据的一致性和完整性。

所以,逻辑删除应运而生。它的核心思想很简单:“假删除,真标记”。我们不真的删除数据行,而是在表里加一个标志字段,比如叫 is_deleted。当要“删除”一条数据时,我们只是把这个字段的值从0(正常)更新为1(已删除)。这样,数据还在库里躺着,只是后续的查询默认会过滤掉那些被标记为“已删除”的数据,就好像它们不存在一样。这就像办公室里的文件归档,不用的文件不是扔进碎纸机,而是放进标着“已归档”的柜子,需要时还能找回来。

MyBatis-Flex 作为一款轻量且强大的 MyBatis 增强框架,对逻辑删除的支持做得非常优雅和自动化。它通过简单的注解配置,就能让开发者几乎无感地使用这个功能,大大提升了开发效率和数据安全性。但光会用逻辑删除还不够,在实际业务中,我们往往还需要知道这条数据是“什么时候”被删除的,这就需要结合自动更新时间功能。今天,我就带你深入 MyBatis-Flex 的这两个特性,看看如何把它们玩转,并解决一些实际开发中会遇到的问题。

2. 核心配置:用 @Column 注解轻松搞定逻辑删除与自动更新

要让 MyBatis-Flex 认识并自动处理逻辑删除,关键就在于实体类字段上的那个 @Column 注解。这个注解功能很强大,远不止定义字段名那么简单。我们先来看看如何用它来配置逻辑删除字段。

2.1 配置逻辑删除字段

在你的实体类里,找到那个用来表示删除状态的字段,通常是 isDeleteddeleted 或者 status。然后,给它加上 @Column(isLogicDelete = true) 这个注解。

import com.mybatisflex.annotation.Column;

public class Account {
    private Long id;
    private String userName;
    // ... 其他字段

    @Column(isLogicDelete = true)
    private Integer isDeleted;

    // getters and setters...
}

就这么简单!我习惯用 Integer 类型,0表示正常,1表示删除。MyBatis-Flex 默认也是这么约定的。当然,你也可以在全局配置里修改这个默认值,比如改成 true/false 或者 Y/N,但0和1是最通用的做法。

配置好后,神奇的事情就发生了。当你使用 BaseMapper 提供的 selectOneByIdselectListpaginate 等方法时,MyBatis-Flex 会自动在生成的 SQL 语句的 WHERE 条件中,加上 AND is_deleted = 0。这意味着,你再也查不到那些被标记为删除的数据了,所有查询都默认只针对“有效数据”。这避免了你在每个查询里都手动写这个条件,既省事又防止了遗漏。

更强大的是,在多表关联查询时,这个机制依然有效。如果你的 Article 表也有逻辑删除字段,那么在 Left Join 时,框架会自动在 ON 条件里为子表加上逻辑删除条件,确保关联出来的也都是有效数据。

2.2 配置自动更新时间字段

逻辑删除知道了“删没删”,我们还需要知道“何时删的”(以及“何时创建的”)。这就需要自动更新时间功能。同样,我们用 @Column 注解来搞定,这次用的是 onUpdateValueonInsertValue 属性。

public class Account {
    private Long id;
    private String userName;

    @Column(onIn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值