大数跨境
0
0

请不要自己写!Spring Boot 一个注解搞定逻辑删除,支持JPA/MyBatis

请不要自己写!Spring Boot 一个注解搞定逻辑删除,支持JPA/MyBatis Spring全家桶实战案例
2025-02-23
0
导读:请不要自己写!Spring Boot 一个注解搞定逻辑删除,支持JPA/MyBatis
Spring Boot 3实战案例合集》现已囊括超过100篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最新的技术与实战案例。订阅用户将特别获赠文末中所有MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

Spring Boot 3实战案例锦集》PDF电子书现已出炉!

🎉🎉我们精心打造的《Spring Boot 3实战案例锦集》PDF电子书现已正式完成,目前已经有100个案例,后续还将继续更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。随着Spring相关技术的更新升级,我们的电子书也将持续更新,确保您始终掌握最前沿、最实用的技术知识。

💌💌如何获取
订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

现在就订阅合集




环境:SpringBoot3.4.0



1. 简介

在软件开发中,逻辑删除作为一种灵活的数据处理方式,被广泛应用于各种系统中。特别是在需要保留数据历史或防止误删除的场景下,逻辑删除显得尤为重要。
通常逻辑删除之所以被采用,主要有以下几个原因:
  • 数据恢复方便,只需更新数据状态即可
  • 保护数据完整性,避免因物理删除而破坏数据关联
  • 满足审计和合规性要求,保留记录的存在
  • 降低误操作风险,为开发者提供安全网
     

然而,逻辑删除也可能导致数据膨胀和查询复杂性增加等问题,因此在使用时需要权衡利弊。

本篇文章将要介绍如何使用JPA和MyBatis来实现逻辑删除的功能。

2. 实战案例

2.1 JPA逻辑删除

基于JPA的逻辑删除,这里介绍2中实现方案。

使用@SQLDelete注解

在实体类上通过该注解定义执行的SQL语句,如下示例:

@Entity@Table(name = "t_person")@SQLDelete(sql = "update t_person p set p.deleted = 1 where p.id = ?")public class Person {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id ;  private String name ;  private Integer age ;  /**0:正常,1:删除*/  @Column(columnDefinition = "int default 0")  private Integer deleted = 0;  // getters, setters}

Repository接口定义

public interface PersonRepository extends JpaRepository<PersonLong> {}

单元测试

@Testpublic void testDelete() {  this.personRepository.deleteById(2L) ;}

最终执行SQL

最终执行了通过@SQLDelete配置的update语句。

使用@SoftDelete注解

@SoftDelete(  strategy = SoftDeleteType.DELETED,   columnName = "deleted"  converter = DeletedAttributeConverter.class)public class Person {  // 这里不需要定义deleted字段}

默认情况下,@SoftDelete注解使用true和false表示删除与未删除。通过converter进行数据类型的转换,这里我们将默认使用的boolean类型改为0,1表示:

public class DeletedAttributeConverter   implements AttributeConverter<BooleanInteger> {  @Override  public Integer convertToDatabaseColumn(Boolean attribute) {    return attribute == null || !attribute ? 0 : 1;  }  @Override  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-value1      # 逻辑未删除值      logic-not-delete-value0

如上定义后,通过MyBatis-Plus的接口进行删除时,将会与jpa一样,执行update语句。

实体定义:

@TableName("t_person")public class Person {  /**0:正常,1:删除*/  private Integer deleted = 0;}

Mapper接口定义如下:

public interface PersonMapper extends BaseMapper<Person> {}

注意,你需要继承MyBatis-Plus的BaseMapper接口。

单元测试

@Testpublic void testMyBatisDelete() {  this.personMapper.deleteById(2L) ;}

SQL输出如下:

执行update语句更新deleted字段值。

指定标记删除字段

以上删除更新字段是根据全局配置文件中配置的字段名进行更新, 如果个别表是其它字段名时可以通过如下配置:

public class Person {  @TableLogic  private Integer state ;}

当执行删除时,则会去更新state字段的值,如下SQL输出:


以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

推荐文章

Spring AI + Ollama 实现 DeepSeek 模型调用

5种实现方式配置Spring Boot API接口超时时间

技术专家!Spring Boot 自定义注解@LockTransactional轻松实现分布式锁与事务管理

Spring Boot + Groovy 实现灵活的动态规则引擎

高级开发!Spring Boot 自定义SQL日志记录(包括, 参数,耗时),支持MyBatis,JPA等

自己动手实现Agent统计API接口调用耗时

强大!Spring Boot全新模块化管理方式

请不要自己写!Spring Boot非常实用的内置功能

实体与DTO如何转换?这个工具很厉害

Tika 与 Spring Boot 的完美结合:支持任意文档解析的神器

性能提升!@Async与CompletableFuture优雅应用

处理Null的神器Optional

Spring Boot 通过@JsonComponent注解完全控制JSON数据

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读195
粉丝0
内容832