【项目实战】在 MyBatis Plus 中添加 `@TableLogic` 注解,以实现逻辑删除

时间:2024-10-21 18:53:09

一,需求描述

在 MyBatis Plus 中实现逻辑删除是一种常见的需求
逻辑删除,通常用于避免直接从数据库中物理删除数据,而是标记这些数据为“已删除”。
逻辑删除,可以通过在表中添加一个额外的字段(如 deletedis_deleted)来实现。
逻辑删除,当该字段为某个值时(例如1或者true),表示这条记录已被逻辑删除。

详细参考地址:/guide/

二,如何在 MyBatis Plus 中设置逻辑删除

下面是如何在 MyBatis Plus 中设置逻辑删除:

2.1 在实体类上添加 @TableLogic 注解:布尔类型

首先,需要在实体类中对应的字段上添加 @TableLogic 注解。

假设你使用的是布尔类型来标记删除状态,那么代码如下:

@Data
public class UserEntity {
    private Long id;
    private String name;    
    @TableLogic
    private Boolean deleted;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.2 在实体类上添加 @TableLogic 注解:整型

如果使用的是整型,可以使用 0 表示未删除,1 表示已删除,在实体类字段上加上@TableLogic注解

@Data
public class UserEntity {
    private Long id;
    private String name; 
    @TableLogic
    private Integer deleted; 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.3 配置全局逻辑删除

接下来,在MyBatis Plus 配置类中启用全局逻辑删除。
需要在 MybatisPlusConfig 类中配置 GlobalConfigdbConfig,注意:配置是基于较旧的 MyBatis Plus 版本。
在最新版本中,需要使用不同的方式来配置全局逻辑删除。
通常是通过MybatisPlusConfig中的CustomGlobalConfig或者直接在mybatis-plus配置类中设置。

@Configuration
@MapperScan("")
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
    @Bean
    public GlobalConfiguration globalConfiguration() {
        GlobalConfiguration globalConfiguration = new GlobalConfiguration();
        DbConfig dbConfig = new DbConfig();
        dbConfig.setLogicDeleteValue(1);   // 逻辑已删除值(默认为1)
        dbConfig.setLogicNotDeleteValue(0); // 逻辑未删除值(默认为0)
        globalConfiguration.setDbConfig(dbConfig);
        return globalConfiguration;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2.4 使用逻辑删除

现在,当你使用 MyBatis Plus 的 CRUD 方法查询数据时,它会自动过滤掉逻辑删除的记录。
同时,当你调用 removeByIdremove 方法删除记录时,MyBatis Plus 会更新 deleted 字段而不是物理删除记录。
为了手动更新逻辑删除状态,你可以使用 update 方法结合条件查询:

UserEntity user = new UserEntity();
user.setId(id);
user.setDeleted(true); // 或者使用1
userMapper.updateById(user);
  • 1
  • 2
  • 3
  • 4