环境:SpringBoot3.4.0
1. 简介
在软件开发中,逻辑删除作为一种灵活的数据处理方式,被广泛应用于各种系统中。特别是在需要保留数据历史或防止误删除的场景下,逻辑删除显得尤为重要。
通常逻辑删除之所以被采用,主要有以下几个原因:
- 数据恢复方便,只需更新数据状态即可
- 保护数据完整性,避免因物理删除而破坏数据关联
- 满足审计和合规性要求,保留记录的存在
- 降低误操作风险,为开发者提供安全网
然而,逻辑删除也可能导致数据膨胀和查询复杂性增加等问题,因此在使用时需要权衡利弊。
本篇文章将要介绍如何使用JPA和MyBatis来实现逻辑删除的功能。
2. 实战案例
2.1 JPA逻辑删除
基于JPA的逻辑删除,这里介绍2中实现方案。
使用@SQLDelete注解
在实体类上通过该注解定义执行的SQL语句,如下示例:
Repository接口定义
单元测试
最终执行SQL
最终执行了通过@SQLDelete配置的update语句。
使用@SoftDelete注解
默认情况下,@SoftDelete注解使用true和false表示删除与未删除。通过converter进行数据类型的转换,这里我们将默认使用的boolean类型改为0,1表示:
当执行删除操作时,输出如下SQL:
图片
2.2 MyBatis逻辑删除
MyBatis的逻辑删除功能并非由它原生支持,而是由mybatis-plus提供的功能。
首先,引入mybatis-plus依赖:
注意你当前的环境,不同的Spring Boot版本2/3引入的依赖包不一样。
接下来,进行如下的配置:
如上定义后,通过MyBatis-Plus的接口进行删除时,将会与jpa一样,执行update语句。
实体定义:
Mapper接口定义如下:
注意,你需要继承MyBatis-Plus的BaseMapper接口。
单元测试
SQL输出如下:
执行update语句更新deleted字段值。
指定标记删除字段
以上删除更新字段是根据全局配置文件中配置的字段名进行更新, 如果个别表是其它字段名时可以通过如下配置:
当执行删除时,则会去更新state字段的值,如下SQL输出:
图片