《Spring Boot 3实战案例锦集》PDF电子书现已出炉!
🎉🎉我们精心打造的《Spring Boot 3实战案例锦集》PDF电子书现已正式完成,目前已经有100个案例,后续还将继续更新。文末有电子书目录。
💪💪永久更新承诺:
我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。随着Spring相关技术的更新升级,我们的电子书也将持续更新,确保您始终掌握最前沿、最实用的技术知识。
💌💌如何获取:
订阅我们的合集《点我订阅》,并通过私信联系我们,我们将第一时间将电子书发送给您。
环境:SpringBoot3.4.0
1. 简介
-
数据恢复方便,只需更新数据状态即可 -
保护数据完整性,避免因物理删除而破坏数据关联 -
满足审计和合规性要求,保留记录的存在 -
降低误操作风险,为开发者提供安全网
然而,逻辑删除也可能导致数据膨胀和查询复杂性增加等问题,因此在使用时需要权衡利弊。
本篇文章将要介绍如何使用JPA和MyBatis来实现逻辑删除的功能。
2. 实战案例
2.1 JPA逻辑删除
基于JPA的逻辑删除,这里介绍2中实现方案。
使用@SQLDelete注解
在实体类上通过该注解定义执行的SQL语句,如下示例:
public class Person {private Long id ;private String name ;private Integer age ;/**0:正常,1:删除*/private Integer deleted = 0;// getters, setters}
Repository接口定义
public interface PersonRepository extends JpaRepository<Person, Long> {}
单元测试
public void testDelete() {this.personRepository.deleteById(2L) ;}
最终执行SQL
最终执行了通过@SQLDelete配置的update语句。
使用@SoftDelete注解
strategy = SoftDeleteType.DELETED,columnName = "deleted",converter = DeletedAttributeConverter.class)public class Person {// 这里不需要定义deleted字段}
默认情况下,@SoftDelete注解使用true和false表示删除与未删除。通过converter进行数据类型的转换,这里我们将默认使用的boolean类型改为0,1表示:
public class DeletedAttributeConverterimplements AttributeConverter<Boolean, Integer> {public Integer convertToDatabaseColumn(Boolean attribute) {return attribute == null || !attribute ? 0 : 1;}public Boolean convertToEntityAttribute(Integer dbData) {return dbData == null || dbData == 0 ? Boolean.FALSE : Boolean.TRUE ;}}
当执行删除操作时,输出如下SQL:
2.2 MyBatis逻辑删除
MyBatis的逻辑删除功能并非由它原生支持,而是由mybatis-plus提供的功能。
首先,引入mybatis-plus依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.10.1</version></dependency>
注意你当前的环境,不同的Spring Boot版本2/3引入的依赖包不一样。
接下来,进行如下的配置:
mybatis-plus:global-config:db-config:# 全局逻辑删除字段名logic-delete-field: deleted# 逻辑已删除值logic-delete-value: 1# 逻辑未删除值logic-not-delete-value: 0
如上定义后,通过MyBatis-Plus的接口进行删除时,将会与jpa一样,执行update语句。
实体定义:
public class Person {/**0:正常,1:删除*/private Integer deleted = 0;}
Mapper接口定义如下:
public interface PersonMapper extends BaseMapper<Person> {}
注意,你需要继承MyBatis-Plus的BaseMapper接口。
单元测试
public void testMyBatisDelete() {this.personMapper.deleteById(2L) ;}
SQL输出如下:
执行update语句更新deleted字段值。
指定标记删除字段
以上删除更新字段是根据全局配置文件中配置的字段名进行更新, 如果个别表是其它字段名时可以通过如下配置:
public class Person {@TableLogicprivate Integer state ;}
当执行删除时,则会去更新state字段的值,如下SQL输出:
以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏
推荐文章
Spring AI + Ollama 实现 DeepSeek 模型调用
技术专家!Spring Boot 自定义注解@LockTransactional轻松实现分布式锁与事务管理
Spring Boot + Groovy 实现灵活的动态规则引擎
高级开发!Spring Boot 自定义SQL日志记录(包括, 参数,耗时),支持MyBatis,JPA等
Tika 与 Spring Boot 的完美结合:支持任意文档解析的神器
性能提升!@Async与CompletableFuture优雅应用
Spring Boot 通过@JsonComponent注解完全控制JSON数据


