mybatis-plus逻辑删除与物理删除

788 阅读2分钟

一、逻辑删除

众所周知,mybatis-plus提供了一个逻辑删除的方法,一般来说我们都会进行yml的全局配置,并且会在代码的逻辑删除字段上添加@TableLogic注解。那么在查询的时候会自动添加where deleted = 0,删除的时候会将deleted字段设置为1,但是数据并未真正删除。

mybatis-plus:
 # 全局配置
  global-config:
   db-config:
   # 全局逻辑删除的字段名
    logic-delete-field: deleted
   # 逻辑已删除值(默认为 1)
    logic-delete-value: 1
   # 逻辑未删除值(默认为 0)
    logic-not-delete-value: 0
@Data
public class Student {
  @TableId(value = "sid")
  private Integer id;
  private String name;
  @TableLogic
  private Integer deleted;
}

二、物理删除

如果这个时候有一个需求,在保证逻辑删除的前提下,需要物理删除某个租户下面的所有Student等等实体类,包括数据库都不需要存(相当于清空所有租户的无效数据)

方法1

在mapper.xml中手写delete语句,每个涉及到的实体类都写一遍...(如果只是单个实体类的话还是推荐的)

方法2

1. 继承mybatis-plus的BaseMapper类,再让其他的Mapper对象继承该接口

public interface BaseMapperX<T> extends BaseMapper<T> {
    int deleteAbsoluteById(Serializable id);
    int deleteAbsoluteById(T entity);
    int deleteAbsolute(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    int deleteAbsoluteBatchByIds(@Param(Constants.COLL) Collection<?> idList);
}

2. 建一个类去继承AbstractMethod,内容可以参考源码写法

public class DeleteAbsoluteById extends AbstractMethod {
    public DeleteAbsoluteById() {
        this(Introspector.decapitalize(DeleteAbsoluteById.class.getSimpleName()));
    }

    public DeleteAbsoluteById(String methodName) {
        super(methodName);
    }

    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        SqlMethod sqlMethod = SqlMethod.DELETE_BY_ID;
        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), tableInfo.getKeyColumn(),
                tableInfo.getKeyProperty());
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, Object.class);
        return this.addDeleteMappedStatement(mapperClass, methodName, sqlSource);
    }
}

3. 自定义EdSqlInjector注入器继承DefaultSqlInjector,添加自定义的方法

public class EdSqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
        methodList.add(new DeleteAbsoluteById());
        methodList.add(new DeleteAbsolute());
        methodList.add(new DeleteAbsoluteBatchByIds());
        return methodList;
    }
}

4. 将自定义的注入器注入到容器中

@Bean
public ISqlInjector sqlInjector() {
    return new EdSqlInjector();
}