一、逻辑删除
众所周知,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();
}