From 0e964aec399dccaff5521d934298f08dc9f1f5d0 Mon Sep 17 00:00:00 2001 From: wangfs <15029758498@163.com> Date: Sun, 7 Dec 2025 16:59:47 +0800 Subject: [PATCH] ProcessBusinessLine增加别名 --- urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/annotation/ProcessBusinessLine.java | 6 ++++++ urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/mybatis/config/BusinessLineSqlInterceptor.java | 44 ++++++++++++++++++++++++++++++++------------ urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/mybatis/config/UrbanopsMybatisAutoConfiguration.java | 3 +++ 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/annotation/ProcessBusinessLine.java b/urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/annotation/ProcessBusinessLine.java index 0084f8d..62d68e1 100644 --- a/urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/annotation/ProcessBusinessLine.java +++ b/urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/annotation/ProcessBusinessLine.java @@ -10,4 +10,10 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) // 运行时保留,支持反射 @Documented public @interface ProcessBusinessLine { + + /** + * 表别名 应对手写sql多表关联增加业务线 + * @return + */ + String aliasName() default ""; } diff --git a/urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/mybatis/config/BusinessLineSqlInterceptor.java b/urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/mybatis/config/BusinessLineSqlInterceptor.java index f9ebe12..51b8bbf 100644 --- a/urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/mybatis/config/BusinessLineSqlInterceptor.java +++ b/urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/mybatis/config/BusinessLineSqlInterceptor.java @@ -57,10 +57,12 @@ public class BusinessLineSqlInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // 1. 跳过过滤则直接执行原 SQL - if (!isSkipAnnotation(invocation)) { + SkipAnnotationVO skipAnnotation = isSkipAnnotation(invocation); + if (!skipAnnotation.skip) { return invocation.proceed(); } String busiLine = SecurityFrameworkUtils.getBusiLine(); + String aliasName = skipAnnotation.aliasName; if (StringUtils.isEmpty(busiLine)) { return invocation.proceed(); } @@ -94,7 +96,7 @@ public class BusinessLineSqlInterceptor implements Interceptor { Set businessLineSet = new HashSet<>(Arrays.asList(busiLine.split(",")));//UserContextHolder.getBusinessLine(); if (!CollectionUtils.isEmpty(businessLineSet)) { // 拼接业务线条件 - String newSql = buildSqlWithBusinessLine(originalSql, businessLineSet, sqlCommandType); + String newSql = buildSqlWithBusinessLine(originalSql, businessLineSet, sqlCommandType, aliasName); log.debug("原始 SQL:{},拼接后 SQL:{}", originalSql, newSql); // 替换原始 SQL metaBoundSql.setValue("sql", newSql); @@ -108,13 +110,18 @@ public class BusinessLineSqlInterceptor implements Interceptor { /** * 拼接业务线条件到 SQL 中 */ - private String buildSqlWithBusinessLine(String originalSql, Set businessLineSet, SqlCommandType sqlCommandType) { + private String buildSqlWithBusinessLine(String originalSql, Set businessLineSet, SqlCommandType sqlCommandType, String aliasName) { String upperSql = originalSql.toUpperCase(); // 核心转换:每个元素加单引号,逗号分隔 String result = businessLineSet.stream() .map(s -> "'" + s + "'") // 为每个元素包裹单引号 .collect(Collectors.joining(",")); // 用逗号拼接所有元素 - String condition = "busi_line in( " + result + ")"; + String condition = ""; + if(StringUtils.isEmpty(aliasName)){ + condition = "busi_line in( " + result + ")"; + }else{ + condition = aliasName + ".busi_line in( " + result + ")"; + } // SELECT 语句:处理 WHERE/ORDER BY/GROUP BY 等 if (SqlCommandType.SELECT.equals(sqlCommandType)) { @@ -176,7 +183,7 @@ public class BusinessLineSqlInterceptor implements Interceptor { * @param invocation 对象 * @return true:拼接业务线;false不拼接业务线 */ - public boolean isSkipAnnotation(Invocation invocation){ + public SkipAnnotationVO isSkipAnnotation(Invocation invocation){ // 1. 获取MappedStatement(MP封装的Mapper方法信息) MappedStatement ms = (MappedStatement) invocation.getArgs()[0]; String mapperMethodId = ms.getId(); // 格式:com.xxx.mapper.UserMapper.selectByAge @@ -191,15 +198,28 @@ public class BusinessLineSqlInterceptor implements Interceptor { throw new RuntimeException(e); } ProcessBusinessLine skipAnnotation = ANNOTATION_CACHE.get(mapperClassName+methodName); - if (skipAnnotation == null) { - if(mapperClass.isAnnotationPresent(ProcessBusinessLine.class)){ - ProcessBusinessLine processBusinessLine = mapperClass.getAnnotation(ProcessBusinessLine.class); - ANNOTATION_CACHE.put(mapperClassName+methodName, processBusinessLine); - return true; - } + if (skipAnnotation != null) { + return new SkipAnnotationVO(true, skipAnnotation.aliasName()); + } + + if(mapperClass.isAnnotationPresent(ProcessBusinessLine.class)){ + ProcessBusinessLine processBusinessLine = mapperClass.getAnnotation(ProcessBusinessLine.class); + ANNOTATION_CACHE.put(mapperClassName+methodName, processBusinessLine); + return new SkipAnnotationVO(true, processBusinessLine.aliasName()); + } + + return new SkipAnnotationVO(false, ""); + } + + public static class SkipAnnotationVO { + public boolean skip; + public String aliasName; + + public SkipAnnotationVO(boolean skip, String aliasName) { + this.skip = skip; + this.aliasName = aliasName; } - return false; } } \ No newline at end of file diff --git a/urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/mybatis/config/UrbanopsMybatisAutoConfiguration.java b/urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/mybatis/config/UrbanopsMybatisAutoConfiguration.java index bf22588..c0952a9 100644 --- a/urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/mybatis/config/UrbanopsMybatisAutoConfiguration.java +++ b/urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/mybatis/config/UrbanopsMybatisAutoConfiguration.java @@ -22,6 +22,7 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; +import org.springframework.core.annotation.Order; import org.springframework.core.env.ConfigurableEnvironment; import java.util.List; @@ -41,6 +42,7 @@ public class UrbanopsMybatisAutoConfiguration { * 注册自定义业务线 SQL 拦截器 */ @Bean + @Order(1) public BusinessLineSqlInterceptor businessLineSqlInterceptor() { return new BusinessLineSqlInterceptor(); } @@ -54,6 +56,7 @@ public class UrbanopsMybatisAutoConfiguration { } @Bean + @Order(2) public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 分页插件 -- libgit2 0.21.4