miemie 4 years ago
parent
commit
2ef75d898c

+ 3 - 0
mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/InterceptorIgnore.java

@@ -8,6 +8,9 @@ import java.lang.annotation.*;
  * 支持注解在 mapper 上以及 mapper.method 上
  * 同时存在则 mapper.method 比 mapper 优先级高
  * 各属性返回 false 表示不走插件(在配置了插件的情况下)
+ * <p>
+ * 支持:
+ * true 和 false , 1 和 0 , on 和 off
  *
  * @author miemie
  * @since 2020-07-31

+ 6 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisMapperAnnotationBuilder.java

@@ -17,6 +17,7 @@ package com.baomidou.mybatisplus.core;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.parser.SqlParserHelper;
+import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
 import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 import lombok.Getter;
 import org.apache.ibatis.annotations.*;
@@ -92,9 +93,11 @@ public class MybatisMapperAnnotationBuilder extends MapperAnnotationBuilder {
         if (!configuration.isResourceLoaded(resource)) {
             loadXmlResource();
             configuration.addLoadedResource(resource);
-            assistant.setCurrentNamespace(type.getName());
+            String mapperName = type.getName();
+            assistant.setCurrentNamespace(mapperName);
             parseCache();
             parseCacheRef();
+            InterceptorIgnoreHelper.InterceptorIgnoreCache cache = InterceptorIgnoreHelper.initSqlParserInfoCache(type);
             for (Method method : type.getMethods()) {
                 if (!canHaveStatement(method)) {
                     continue;
@@ -106,7 +109,8 @@ public class MybatisMapperAnnotationBuilder extends MapperAnnotationBuilder {
                 try {
                     parseStatement(method);
                     // TODO 加入 SqlParser 注解过滤缓存
-                    SqlParserHelper.initSqlParserInfoCache(type.getName(), method);
+                    InterceptorIgnoreHelper.initSqlParserInfoCache(cache, mapperName, method);
+                    SqlParserHelper.initSqlParserInfoCache(mapperName, method);
                 } catch (IncompleteElementException e) {
                     // TODO 使用 MybatisMethodResolver 而不是 MethodResolver
                     configuration.addIncompleteMethod(new MybatisMethodResolver(this, method));

+ 74 - 24
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/plugins/InterceptorIgnoreHelper.java

@@ -2,14 +2,14 @@ package com.baomidou.mybatisplus.core.plugins;
 
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
+import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 
 import java.lang.reflect.Method;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -32,55 +32,105 @@ public class InterceptorIgnoreHelper {
      *
      * @param mapperClass Mapper Class
      */
-    public synchronized static void initSqlParserInfoCache(Class<?> mapperClass) {
+    public synchronized static InterceptorIgnoreCache initSqlParserInfoCache(Class<?> mapperClass) {
         InterceptorIgnore ignore = mapperClass.getAnnotation(InterceptorIgnore.class);
         if (ignore != null) {
-            INTERCEPTOR_IGNORE_CACHE.put(mapperClass.getName(), buildInterceptorIgnoreCache(ignore));
+            return buildInterceptorIgnoreCache(ignore);
         }
+        return null;
     }
 
     /**
      * 初始化缓存 方法上 InterceptorIgnore 注解信息
      *
-     * @param mapperClassName Mapper Class Name
-     * @param method          Method
+     * @param mapperAnnotation Mapper Class Name
+     * @param method           Method
      */
-    public static void initSqlParserInfoCache(String mapperClassName, Method method) {
+    public static void initSqlParserInfoCache(InterceptorIgnoreCache mapperAnnotation, String mapperClassName, Method method) {
         InterceptorIgnore ignore = method.getAnnotation(InterceptorIgnore.class);
+        final String key = mapperClassName.concat(StringPool.DOT).concat(method.getName());
         if (ignore != null) {
-            INTERCEPTOR_IGNORE_CACHE.computeIfAbsent(mapperClassName.concat(StringPool.DOT).concat(method.getName()),
-                k -> buildInterceptorIgnoreCache(ignore));
+            InterceptorIgnoreCache methodCache = buildInterceptorIgnoreCache(ignore);
+            if (mapperAnnotation == null) {
+                INTERCEPTOR_IGNORE_CACHE.put(key, methodCache);
+                return;
+            }
+            INTERCEPTOR_IGNORE_CACHE.put(key, chooseCache(mapperAnnotation, methodCache));
+        } else if (mapperAnnotation != null) {
+            INTERCEPTOR_IGNORE_CACHE.put(key, mapperAnnotation);
         }
     }
 
+    public static boolean willIgnoreTenantLine(String id) {
+        return willIgnore(id, i -> i.getTenantLine() != null && i.getTenantLine());
+    }
+
+    public static boolean willIgnoreDynamicTableName(String id) {
+        return willIgnore(id, i -> i.getDynamicTableName() != null && i.getDynamicTableName());
+    }
+
+    public static boolean willIgnoreBlockAttack(String id) {
+        return willIgnore(id, i -> i.getBlockAttack() != null && i.getBlockAttack());
+    }
+
+    public static boolean willIgnoreIllegalSql(String id) {
+        return willIgnore(id, i -> i.getIllegalSql() != null && i.getIllegalSql());
+    }
+
     public static boolean willIgnore(String id, Function<InterceptorIgnoreCache, Boolean> function) {
         InterceptorIgnoreCache cache = INTERCEPTOR_IGNORE_CACHE.get(id);
-        if (cache == null) {
-            id = id.substring(0, id.lastIndexOf(StringPool.DOT));
-            cache = INTERCEPTOR_IGNORE_CACHE.get(id);
-        }
         if (cache != null) {
             return function.apply(cache);
         }
         return false;
     }
 
+    private static InterceptorIgnoreCache chooseCache(InterceptorIgnoreCache mapper, InterceptorIgnoreCache method) {
+        return InterceptorIgnoreCache.builder()
+            .tenantLine(chooseBoolean(mapper.getTenantLine(), method.getTenantLine()))
+            .dynamicTableName(chooseBoolean(mapper.getDynamicTableName(), method.getDynamicTableName()))
+            .blockAttack(chooseBoolean(mapper.getBlockAttack(), method.getBlockAttack()))
+            .illegalSql(chooseBoolean(mapper.getIllegalSql(), method.getIllegalSql()))
+            .additional(method.getAdditional())
+            .build();
+    }
+
     private static InterceptorIgnoreCache buildInterceptorIgnoreCache(InterceptorIgnore ignore) {
-        String tenantLine = ignore.tenantLine();
-        String dynamicTableName = ignore.dynamicTableName();
-        String blockAttack = ignore.blockAttack();
-        String illegalSql = ignore.illegalSql();
         String[] additional = ignore.additional();
-        return new InterceptorIgnoreCache(StringUtils.isBlank(tenantLine) ? null : Boolean.valueOf(tenantLine),
-            StringUtils.isBlank(dynamicTableName) ? null : Boolean.valueOf(dynamicTableName),
-            StringUtils.isBlank(blockAttack) ? null : Boolean.valueOf(blockAttack),
-            StringUtils.isBlank(illegalSql) ? null : Boolean.valueOf(illegalSql),
-            ArrayUtils.isEmpty(additional) ? Collections.emptyList() : Arrays.asList(additional)
-        );
+        return InterceptorIgnoreCache.builder()
+            .tenantLine(getBoolean(ignore.tenantLine()))
+            .dynamicTableName(getBoolean(ignore.dynamicTableName()))
+            .blockAttack(getBoolean(ignore.blockAttack()))
+            .illegalSql(getBoolean(ignore.illegalSql()))
+            .additional(ArrayUtils.isEmpty(additional) ? null : Arrays.asList(additional))
+            .build();
+    }
+
+    private static Boolean getBoolean(String value) {
+        if (StringUtils.isBlank(value)) {
+            return null;
+        }
+        if ("1".equals(value) || "true".equals(value) || "on".equals(value)) {
+            return true;
+        }
+        if ("0".equals(value) || "false".equals(value) || "off".equals(value)) {
+            return false;
+        }
+        throw ExceptionUtils.mpe("not support this value of \"%s\"", value);
+    }
+
+    private static Boolean chooseBoolean(Boolean mapper, Boolean method) {
+        if (mapper == null && method == null) {
+            return null;
+        }
+        if (method != null) {
+            return method;
+        }
+        return mapper;
     }
 
     @Data
-    @AllArgsConstructor
+    @Builder
     public static class InterceptorIgnoreCache {
         private Boolean tenantLine;
         private Boolean dynamicTableName;

+ 46 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/plugins/InterceptorIgnoreHelperTest.java

@@ -0,0 +1,46 @@
+package com.baomidou.mybatisplus.core.plugins;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.junit.jupiter.api.Test;
+
+import java.lang.reflect.Method;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author miemie
+ * @since 2020-08-02
+ */
+class InterceptorIgnoreHelperTest {
+
+    @Test
+    void m1() {
+        InterceptorIgnoreHelper.InterceptorIgnoreCache cache = InterceptorIgnoreHelper.initSqlParserInfoCache(Xx.class);
+        for (Method method : Xx.class.getMethods()) {
+            InterceptorIgnoreHelper.initSqlParserInfoCache(cache, Xx.class.getName(), method);
+        }
+        boolean b = InterceptorIgnoreHelper.willIgnoreTenantLine(
+            "com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelperTest$Xx.gg");
+        assertThat(b).isTrue();
+
+        b = InterceptorIgnoreHelper.willIgnoreTenantLine(
+            "com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelperTest$Xx.hh");
+        assertThat(b).isFalse();
+
+        b = InterceptorIgnoreHelper.willIgnoreTenantLine(
+            "com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelperTest$Xx.mm");
+        assertThat(b).isTrue();
+    }
+
+    @InterceptorIgnore(tenantLine = "on")
+    interface Xx {
+
+        void gg();
+
+        @InterceptorIgnore(tenantLine = "off")
+        void hh();
+
+        @InterceptorIgnore(illegalSql = "off")
+        void mm();
+    }
+}

+ 1 - 8
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/BlockAttackInnerInterceptor.java

@@ -42,7 +42,7 @@ public class BlockAttackInnerInterceptor extends JsqlParserSupport implements In
         MappedStatement ms = handler.mappedStatement();
         SqlCommandType sct = ms.getSqlCommandType();
         if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) {
-            if (ignore(ms)) return;
+            if (InterceptorIgnoreHelper.willIgnoreBlockAttack(ms.getId())) return;
             BoundSql boundSql = handler.boundSql();
             parserMulti(boundSql.getSql(), null);
         }
@@ -57,11 +57,4 @@ public class BlockAttackInnerInterceptor extends JsqlParserSupport implements In
     protected void processUpdate(Update update, int index, Object obj) {
         Assert.notNull(update.getWhere(), "Prohibition of table update operation");
     }
-
-    public boolean ignore(MappedStatement ms) {
-        return InterceptorIgnoreHelper.willIgnore(ms.getId(), i -> {
-            Boolean blockAttack = i.getBlockAttack();
-            return blockAttack != null && blockAttack;
-        });
-    }
 }

+ 2 - 9
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DynamicTableNameInnerInterceptor.java

@@ -53,7 +53,7 @@ public class DynamicTableNameInnerInterceptor implements InnerInterceptor {
     @Override
     public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
         PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
-        if (ignore(ms)) return;
+        if (InterceptorIgnoreHelper.willIgnoreDynamicTableName(ms.getId())) return;
         mpBs.sql(this.changeTable(mpBs.sql()));
     }
 
@@ -63,7 +63,7 @@ public class DynamicTableNameInnerInterceptor implements InnerInterceptor {
         MappedStatement ms = mpSh.mappedStatement();
         SqlCommandType sct = ms.getSqlCommandType();
         if (sct == SqlCommandType.INSERT || sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) {
-            if (ignore(ms)) return;
+            if (InterceptorIgnoreHelper.willIgnoreDynamicTableName(ms.getId())) return;
             PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql();
             mpBs.sql(this.changeTable(mpBs.sql()));
         }
@@ -94,11 +94,4 @@ public class DynamicTableNameInnerInterceptor implements InnerInterceptor {
         }
         return builder.toString();
     }
-
-    public boolean ignore(MappedStatement ms) {
-        return InterceptorIgnoreHelper.willIgnore(ms.getId(), i -> {
-            Boolean dynamicTableName = i.getDynamicTableName();
-            return dynamicTableName != null && dynamicTableName;
-        });
-    }
 }

+ 2 - 9
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/IllegalSQLInnerInterceptor.java

@@ -93,8 +93,8 @@ public class IllegalSQLInnerInterceptor extends JsqlParserSupport implements Inn
         PluginUtils.MPStatementHandler mpStatementHandler = PluginUtils.mpStatementHandler(sh);
         MappedStatement ms = mpStatementHandler.mappedStatement();
         SqlCommandType sct = ms.getSqlCommandType();
-        if (sct == SqlCommandType.INSERT || SqlParserHelper.getSqlParserInfo(ms)) return;
-        if (ignore(ms)) return;
+        if (sct == SqlCommandType.INSERT || InterceptorIgnoreHelper.willIgnoreIllegalSql(ms.getId())
+            || SqlParserHelper.getSqlParserInfo(ms)) return;
         BoundSql boundSql = mpStatementHandler.boundSql();
         String originalSql = boundSql.getSql();
         logger.debug("检查SQL是否合规,SQL:" + originalSql);
@@ -335,13 +335,6 @@ public class IllegalSQLInnerInterceptor extends JsqlParserSupport implements Inn
         return indexInfos;
     }
 
-    public boolean ignore(MappedStatement ms) {
-        return InterceptorIgnoreHelper.willIgnore(ms.getId(), i -> {
-            Boolean illegalSql = i.getIllegalSql();
-            return illegalSql != null && illegalSql;
-        });
-    }
-
     /**
      * 索引对象
      */

+ 2 - 9
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptor.java

@@ -63,7 +63,7 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
 
     @Override
     public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
-        if (ignore(ms)) return;
+        if (InterceptorIgnoreHelper.willIgnoreTenantLine(ms.getId())) return;
         if (SqlParserHelper.getSqlParserInfo(ms)) return;
         PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
         mpBs.sql(parserSingle(mpBs.sql(), null));
@@ -75,7 +75,7 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
         MappedStatement ms = mpSh.mappedStatement();
         SqlCommandType sct = ms.getSqlCommandType();
         if (sct == SqlCommandType.INSERT || sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) {
-            if (ignore(ms)) return;
+            if (InterceptorIgnoreHelper.willIgnoreTenantLine(ms.getId())) return;
             if (SqlParserHelper.getSqlParserInfo(ms)) return;
             PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql();
             mpBs.sql(parserMulti(mpBs.sql(), null));
@@ -342,13 +342,6 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
         return new Column(column.toString());
     }
 
-    public boolean ignore(MappedStatement ms) {
-        return InterceptorIgnoreHelper.willIgnore(ms.getId(), i -> {
-            Boolean tenantLine = i.getTenantLine();
-            return tenantLine != null && tenantLine;
-        });
-    }
-
     @Override
     public void setProperties(Properties properties) {
         PropertyMapper.newInstance(properties)