最近项目遇到一个问题就是使用mybaits-plus,虽然mybaits-plus,可以配置逻辑删除,但是不能既有物理删除又有逻辑删除,所以只有自己写了。 我用的是3.1.1版本 第一步 写一个类继续 AbstractMethod 3.1.1之前版本是继承 AbstractLogicMethod 第二步 写一个BaseDao 继承BaseMapper 第三步 写一个枚举类 第四步 加入到SqlInjector 最后一步就是注入Bean 好了这样就可以使用了,这个自定义注入器 mybaits-plus官网有介绍,在此不做解释。 文章若有不对之处,私信给我一起探讨。public class LogicDeleteByWrapper extends AbstractMethod {
@Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
BaseSqlMethod sqlMethod = BaseSqlMethod.LOGIC_DELETE_BY_WRAPPER;
String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlLogicSet(), sqlWhereEntityWrapper(true, tableInfo));
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
}
public String sqlLogicSet() {
return "<trim prefix=\"SET\" suffixOverrides=\",\">\n<if test=\"et.updateBy != null\">update_by=#{et.updateBy},</if>\n<if test=\"et.updateTime != null\">update_time=#{et.updateTime},</if>\nis_deleted = 1\n</trim> ";
}
public interface BaseDao<T> extends BaseMapper<T> {
/**
* 逻辑删除
* @param entity
* @param updateWrapper
* @return
*/
int logicDeleteByWrapper(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
}
public enum BaseSqlMethod {
/**
* 根据参数逻辑删除
*/
LOGIC_DELETE_BY_WRAPPER("logicDeleteByWrapper", "根据ID 修改数据", "<script>\nUPDATE %s %s %s\n</script>"),
/**
* 根据id逻辑删除
*/
LOGIC_DELETE_BY_ID("logicDeleteById", "根据ID 修改数据", "<script>\nUPDATE %s %s WHERE %s=#{%s}\n</script>");
private final String method;
private final String desc;
private final String sql;
BaseSqlMethod(String method, String desc, String sql) {
this.method = method;
this.desc = desc;
this.sql = sql;
}
public String getMethod() {
return method;
}
public String getDesc() {
return desc;
}
public String getSql() {
return sql;
}
public class BaseLogicSqlInjector extends AbstractSqlInjector {
@Override
public List<AbstractMethod> getMethodList() {
return Stream.of(
new Insert(),
new Delete(),
new DeleteByMap(),
new DeleteById(),
new DeleteBatchByIds(),
new Update(),
new UpdateById(),
new SelectById(),
new SelectBatchByIds(),
new SelectByMap(),
new SelectOne(),
new SelectCount(),
new SelectMaps(),
new SelectMapsPage(),
new SelectObjs(),
new SelectList(),
new SelectPage(),
new LogicDeleteByWrapper()
).collect(Collectors.toList());
}
}
@Configuration
@MapperScan("com.xxx.*.*.dao")
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
@Bean
public ISqlInjector sqlInjector() {
return new BaseLogicSqlInjector();
}
/**
* SQL执行效率插件
*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
}