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

简介: Mybatis-plus使用@TableLogic注解进行逻辑删除数据后,在某些场景下,又需要查询该数据时,又不想写SQL。自定义Mybatis-plus的SQL注入器一劳永逸的解决该问题

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

publicclassSelectIgnoreLogicDeleteByMapextendsAbstractMethod {
@OverridepublicMappedStatementinjectMappedStatement(Class<?>mapperClass, Class<?>modelClass, TableInfotableInfo) {
StringsqlBase="<script>SELECT %s FROM %s %s\n</script>";
StringsqlScript=this.sqlWhereByMap(tableInfo);
Stringsql=String.format(sqlBase, this.sqlSelectColumns(tableInfo, false), tableInfo.getTableName(), sqlScript);
SqlSourcesqlSource=this.languageDriver.createSqlSource(this.configuration, sql, Map.class);
returnthis.addSelectMappedStatementForTable(mapperClass, "selectIgnoreLogicDeleteByMap", sqlSource, tableInfo);
    }
/*** 拼接where条件根据map参数** [url=home.php?mod=space&uid=952169]@Param[/url] table 表* [url=home.php?mod=space&uid=155549]@Return[/url] sql*/protectedStringsqlWhereByMap(TableInfotable) {
StringsqlScript;
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);
returnsqlScript;
    }
}

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

publicclassSelectIgnoreLogicDeleteextendsAbstractMethod {
@OverridepublicMappedStatementinjectMappedStatement(Class<?>mapperClass, Class<?>modelClass, TableInfotableInfo) {
StringsqlBase="<script>%s SELECT %s FROM %s %s %s %s\n</script>";
Stringsql=String.format(sqlBase, this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), this.sqlComment());
SqlSourcesqlSource=this.languageDriver.createSqlSource(this.configuration, sql, modelClass);
returnthis.addSelectMappedStatementForTable(mapperClass, "selectIgnoreLogicDelete", sqlSource, tableInfo);
    }
/*** 拼接where条件** @param newLine 新行* @param table   表* @return sql*/protectedStringsqlWhereEntityWrapper(booleannewLine, TableInfotable) {
StringsqlScript=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);
returnnewLine?"\n"+sqlScript : sqlScript;
    }

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

publicclassCustomSqlInjectorextendsDefaultSqlInjector {
@OverridepublicList<AbstractMethod>getMethodList(Class<?>mapperClass, TableInfotableInfo) {
List<AbstractMethod>methodList=super.getMethodList(mapperClass, tableInfo);
methodList.add(newSelectIgnoreLogicDeleteByMap());
methodList.add(newSelectIgnoreLogicDelete());
returnmethodList;
    }
}

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

publicinterfaceCustomBaseMapper<T>extendsBaseMapper<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);
}

2.使用声明的方法

业务mapper继承自定义的CustomBaseMapper

@MapperpublicinterfaceUserMapperextendsCustomBaseMapper<User> {
}

调用方法selectIgnoreLogicDelete

@OverridepublicList<User>getIgnoreDeleteById(LonguserId) {
LambdaQueryWrapper<User>queryWrapper=newLambdaQueryWrapper<>();
queryWrapper.eq(User::getId,userId);
returnthis.baseMapper.selectIgnoreLogicDelete(queryWrapper);
}

调用方法selectIgnoreLogicDeleteByMap

@OverridepublicList<User>getIgnoreDeleteById(LonguserId) {
Map<String, Object>columnMap=newHashMap<>(2);
columnMap.put("id", userId);
returnthis.baseMapper.selectIgnoreLogicDeleteByMap(columnMap);
}
目录
相关文章
|
15天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
6天前
|
SQL 监控 关系型数据库
SQL语句当前及历史信息查询-performance schema的使用
本文介绍了如何使用MySQL的Performance Schema来获取SQL语句的当前和历史执行信息。Performance Schema默认在MySQL 8.0中启用,可以通过查询相关表来获取详细的SQL执行信息,包括当前执行的SQL、历史执行记录和统计汇总信息,从而快速定位和解决性能瓶颈。
|
17天前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
61 10
|
11天前
|
SQL 关系型数据库 MySQL
|
16天前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
25天前
|
SQL 数据库 开发者
功能发布-自定义SQL查询
本期主要为大家介绍ClkLog九月上线的新功能-自定义SQL查询。
|
21天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
30 0
|
1月前
|
SQL 数据可视化 BI
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色
|
SQL 存储 索引