Mybatis-plus自定义SQL注入器查询@TableLogic逻辑删除后的数据详解

 更新时间:2023年03月09日 10:54:38   作者:Hi,all  
这篇文章主要给大家介绍了关于Mybatis-plus自定义SQL注入器查询@TableLogic逻辑删除后的数据的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1  需求

Mybatis-plus使用@TableLogic注解进行逻辑删除数据后,在某些场景下,又需要查询该数据时,又不想写SQL。

2  解决方案

自定义Mybatis-plus的SQL注入器一劳永逸的解决该问题

3  方案:

3.1  方案1,继承 AbstractMethod拼接SQL语句

public class SelectIgnoreLogicDeleteByMap extends AbstractMethod {
 
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
 
        String sqlBase= "<script>SELECT %s FROM %s %s\n</script>";
        String sqlScript = this.sqlWhereByMap(tableInfo);
        String sql = String.format(sqlBase, this.sqlSelectColumns(tableInfo, false), tableInfo.getTableName(), sqlScript);
        SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, Map.class);
        return this.addSelectMappedStatementForTable(mapperClass, "selectIgnoreLogicDeleteByMap", sqlSource, tableInfo);
    }
 
    /**
     * 拼接where条件根据map参数
     *
     * @param table 表
     * @return sql
     */
    protected String sqlWhereByMap(TableInfo table) {
        String sqlScript;
        sqlScript = SqlScriptUtils.convertChoose("v == null", " ${k} IS NULL ", " ${k} = #{v} ");
        sqlScript = SqlScriptUtils.convertForeach(sqlScript, "cm", "k", "v", "AND");
        sqlScript = SqlScriptUtils.convertWhere(sqlScript);
        sqlScript = SqlScriptUtils.convertIf(sqlScript, String.format("%s != null and !%s", "cm", "cm.isEmpty"), true);
        return sqlScript;
    }
}

3.2. 方案2,继承 AbstractMethod拼接SQL语句

public class SelectIgnoreLogicDelete extends AbstractMethod {
 
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
 
        String sqlBase = "<script>%s SELECT %s FROM %s %s %s %s\n</script>";
 
        String sql = String.format(sqlBase, this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), this.sqlComment());
        SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass);
        return this.addSelectMappedStatementForTable(mapperClass, "selectIgnoreLogicDelete", sqlSource, tableInfo);
    }
 
    /**
     * 拼接where条件
     *
     * @param newLine 新行
     * @param table   表
     * @return sql
     */
    protected String sqlWhereEntityWrapper(boolean newLine, TableInfo table) {
        String sqlScript = table.getAllSqlWhere(false, true, "ew.entity.");
        sqlScript = SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", "ew.entity"), true);
        sqlScript = sqlScript + "\n";
        sqlScript = sqlScript + SqlScriptUtils.convertIf(String.format(SqlScriptUtils.convertIf(" AND", String.format("%s and %s", "ew.nonEmptyOfEntity", "ew.nonEmptyOfNormal"), false) + " ${%s}", "ew.sqlSegment"), String.format("%s != null and %s != '' and %s", "ew.sqlSegment", "ew.sqlSegment", "ew.nonEmptyOfWhere"), true);
        sqlScript = SqlScriptUtils.convertWhere(sqlScript) + "\n";
        sqlScript = sqlScript + SqlScriptUtils.convertIf(String.format(" ${%s}", "ew.sqlSegment"), String.format("%s != null and %s != '' and %s", "ew.sqlSegment", "ew.sqlSegment", "ew.emptyOfWhere"), true);
        sqlScript = SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", "ew"), true);
        return newLine ? "\n" + sqlScript : sqlScript;
    }

4.  自定义SQL注入器,注册上述自定义的方法

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

5.  自定义基础mapper,声明注册的方法

public interface CustomBaseMapper<T> extends BaseMapper<T> {
 
    /**
     * 根据map条件查询数据,并忽略逻辑删除
     *
     * @param columnMap 查询条件
     * @return 结果信息
     */
    List<T> selectIgnoreLogicDeleteByMap(@Param("cm") Map<String, Object> columnMap);
 
    /**
     * 根据条件查询数据,并忽略逻辑删除
     *
     * @param queryWrapper 查询条件
     * @return 结果信息
     */
    List<T> selectIgnoreLogicDelete(@Param("ew") Wrapper<T> queryWrapper);
}

6. 使用声明的方法

6.1  业务mapper继承自定义的CustomBaseMapper

@Mapper
public interface UserMapper extends CustomBaseMapper<User> {
}

6.2 调用方法selectIgnoreLogicDelete

    @Override
    public List<User> getIgnoreDeleteById(Long userId) {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getId,userId);
        return this.baseMapper.selectIgnoreLogicDelete(queryWrapper);
    }

6.3 调用方法selectIgnoreLogicDeleteByMap

    @Override
    public List<User> getIgnoreDeleteById(Long userId) {
		Map<String, Object> columnMap = new HashMap<>(2);
        columnMap.put("id", userId);
        return this.baseMapper.selectIgnoreLogicDeleteByMap(columnMap);
    }

总结

到此这篇关于Mybatis-plus自定义SQL注入器查询@TableLogic逻辑删除后的数据的文章就介绍到这了,更多相关Mybatis-plus查询@TableLogic逻辑删除后数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java开源区块链jdchain入门

    java开源区块链jdchain入门

    这篇文章主要介绍了java开源区块链jdchain入门,文中为大家讲解了关于部署及组件遇到的一些问题,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • idea自定义快捷代码生成模板的方法

    idea自定义快捷代码生成模板的方法

    这篇文章主要介绍了idea自定义快捷代码生成模板的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java中double保留两位小数的多种方法

    Java中double保留两位小数的多种方法

    这篇文章主要给大家介绍了关于Java中double保留两位小数的多种方法,对于double数据类型进行计算发生的精度丢失的情况,可以按照自己的需求选择任意方式,需要的朋友可以参考下
    2023-07-07
  • 如何在Java中优雅地判空详解

    如何在Java中优雅地判空详解

    这篇文章主要大家介绍了关于如何在Java中优雅地判空的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • spring boot项目实战之实现与数据库的连接

    spring boot项目实战之实现与数据库的连接

    在我们日常的开发过程中,肯定不可避免的会使用到数据库以及SQL 语句,下面这篇文章主要给大家介绍了关于spring boot项目实战之实现与数据库连接的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • SpringBoot图文并茂讲解依赖管理的特性

    SpringBoot图文并茂讲解依赖管理的特性

    一般来讲SpringBoot项目是不需要指定版本,而SSM项目是需要指定版本,SpringBoot的核心依赖就是spring-boot-starter-parent和spring-boot-starter-web两个依赖,关于这两个依赖的相关介绍具体今天小编给大家介绍下
    2022-06-06
  • Java编程中的vector类用法学习笔记

    Java编程中的vector类用法学习笔记

    Vector通常被用来实现动态数组,即可实现自动增长的对象数组,和C++一样vector类同样被Java内置,下面就来看一下vector类的基本用法.
    2016-05-05
  • Java中输入输出方式详细讲解

    Java中输入输出方式详细讲解

    这篇文章主要给大家介绍了关于Java中输入输出方式的相关资料,Java输入输出是指使用java提供的一些类和方法来实现数据的输入和输出,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • maven报错:Failed to execute goal on project问题及解决

    maven报错:Failed to execute goal on p

    这篇文章主要介绍了maven报错:Failed to execute goal on project问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java实现创建Zip压缩包并写入文件

    Java实现创建Zip压缩包并写入文件

    这篇文章主要为大家详细介绍了Java实现创建Zip压缩包并写入文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论