= пре 7 година
родитељ
комит
14e9d9b395

+ 16 - 1
mybatis-plus-boot-starter/src/main/java/com/baomidou/mybatisplus/spring/boot/starter/GlobalConfig.java

@@ -75,6 +75,10 @@ public class GlobalConfig {
      * 表关键词 key 生成器
      */
     private String keyGenerator;
+    /**
+     * 缓存 Sql 解析初始化
+     */
+    private Boolean sqlParserCache;
 
     public Integer getIdType() {
         return idType;
@@ -164,6 +168,14 @@ public class GlobalConfig {
         this.keyGenerator = keyGenerator;
     }
 
+    public Boolean getSqlParserCache() {
+        return sqlParserCache;
+    }
+
+    public void setSqlParserCache(Boolean sqlParserCache) {
+        this.sqlParserCache = sqlParserCache;
+    }
+
     public GlobalConfiguration convertGlobalConfiguration() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
         GlobalConfiguration globalConfiguration = new GlobalConfiguration();
         if (StringUtils.isNotEmpty(this.getIdentifierQuote())) {
@@ -187,7 +199,7 @@ public class GlobalConfig {
         if (StringUtils.checkValNotNull(this.getIdType())) {
             globalConfiguration.setIdType(this.getIdType());
         }
-        if (StringUtils.checkValNotNull(this.getDbColumnUnderline())) {
+        if (null != this.getDbColumnUnderline()) {
             globalConfiguration.setDbColumnUnderline(this.getDbColumnUnderline());
         }
         if (StringUtils.checkValNotNull(this.getFieldStrategy())) {
@@ -199,6 +211,9 @@ public class GlobalConfig {
         if (StringUtils.checkValNotNull(this.getCapitalMode())) {
             globalConfiguration.setCapitalMode(this.getCapitalMode());
         }
+        if (null != this.getSqlParserCache()) {
+            globalConfiguration.setSqlParserCache(this.getSqlParserCache());
+        }
         return globalConfiguration;
     }
 

+ 13 - 0
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/entity/GlobalConfiguration.java

@@ -104,11 +104,17 @@ public class GlobalConfiguration implements Serializable {
      * 单例重用SqlSession
      */
     private SqlSession sqlSession;
+    /**
+     * 缓存 Sql 解析初始化
+     */
+    private boolean sqlParserCache = false;
+
 
     public GlobalConfiguration() {
         // 构造方法
     }
 
+
     public GlobalConfiguration(ISqlInjector sqlInjector) {
         this.sqlInjector = sqlInjector;
     }
@@ -250,6 +256,13 @@ public class GlobalConfiguration implements Serializable {
         return sqlSession;
     }
 
+    public boolean isSqlParserCache() {
+        return sqlParserCache;
+    }
+
+    public void setSqlParserCache(boolean sqlParserCache) {
+        this.sqlParserCache = sqlParserCache;
+    }
 
     /**
      * <p>

+ 6 - 0
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/entity/SqlParserInfo.java

@@ -16,6 +16,8 @@
 package com.baomidou.mybatisplus.entity;
 
 
+import com.baomidou.mybatisplus.annotations.SqlParser;
+
 /**
  * <p>
  * SQL 解析信息
@@ -35,6 +37,10 @@ public class SqlParserInfo {
 
     }
 
+    public SqlParserInfo(SqlParser sqlParser) {
+        this.filter = sqlParser.filter();
+    }
+
     public boolean getFilter() {
         return filter;
     }

+ 9 - 2
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/mapper/AutoSqlInjector.java

@@ -28,6 +28,7 @@ import java.util.Set;
 import com.baomidou.mybatisplus.toolkit.ArrayUtils;
 import com.baomidou.mybatisplus.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.toolkit.GlobalConfigUtils;
+import com.baomidou.mybatisplus.toolkit.PluginUtils;
 import com.baomidou.mybatisplus.toolkit.SqlReservedWords;
 import com.baomidou.mybatisplus.toolkit.StringUtils;
 import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
@@ -97,7 +98,7 @@ public class AutoSqlInjector implements ISqlInjector {
         this.configuration = builderAssistant.getConfiguration();
         this.builderAssistant = builderAssistant;
         this.languageDriver = configuration.getDefaultScriptingLanguageInstance();
-        /*
+        /**
          * 驼峰设置 PLUS 配置 > 原始配置
 		 */
         GlobalConfiguration globalCache = this.getGlobalConfig();
@@ -105,7 +106,13 @@ public class AutoSqlInjector implements ISqlInjector {
             globalCache.setDbColumnUnderline(configuration.isMapUnderscoreToCamelCase());
         }
         Class<?> modelClass = extractModelClass(mapperClass);
-        if (modelClass != null) {
+        if (null != modelClass) {
+            /**
+             * 初始化 SQL 解析
+             */
+            if (globalCache.isSqlParserCache()) {
+                PluginUtils.initSqlParserInfoCache(mapperClass);
+            }
             TableInfo table = TableInfoHelper.initTableInfo(builderAssistant, modelClass);
             injectSql(builderAssistant, mapperClass, modelClass, table);
         }

+ 1 - 1
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/plugins/SqlParserHandler.java

@@ -51,7 +51,7 @@ public abstract class SqlParserHandler {
             if (CollectionUtils.isNotEmpty(this.sqlParserList)) {
                 // @SqlParser(filter = true) 跳过该方法解析
                 SqlParserInfo sqlParserInfo = PluginUtils.getSqlParserInfo(metaObject);
-                if (sqlParserInfo.getFilter()) {
+                if (null != sqlParserInfo && sqlParserInfo.getFilter()) {
                     return;
                 }
                 // 标记是否修改过 SQL

+ 19 - 26
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/toolkit/PluginUtils.java

@@ -52,6 +52,24 @@ public final class PluginUtils {
         // to do nothing
     }
 
+    /**
+     * <p>
+     * 初始化缓存 SqlParser 注解信息
+     * </p>
+     *
+     * @param mapperClass Mapper Class
+     */
+    public synchronized static void initSqlParserInfoCache(Class<?> mapperClass) {
+        Method[] methods = mapperClass.getDeclaredMethods();
+        for (Method method : methods) {
+            SqlParser sqlParser = method.getAnnotation(SqlParser.class);
+            if (null != sqlParser) {
+                StringBuilder sid = new StringBuilder();
+                sid.append(mapperClass.getName()).append(".").append(method.getName());
+                sqlParserInfoCache.put(sid.toString(), new SqlParserInfo(sqlParser));
+            }
+        }
+    }
 
     /**
      * <p>
@@ -62,32 +80,7 @@ public final class PluginUtils {
      * @return
      */
     public static SqlParserInfo getSqlParserInfo(MetaObject metaObject) {
-        try {
-            MappedStatement ms = getMappedStatement(metaObject);
-            String statementId = ms.getId();
-            SqlParserInfo sqlParserInfo = sqlParserInfoCache.get(statementId);
-            if (null != sqlParserInfo) {
-                // 存在直接返回
-                return sqlParserInfo;
-            }
-            // 初始化缓存 SqlParser 注解信息
-            String namespace = statementId.substring(0, statementId.lastIndexOf("."));
-            Method[] methods = Class.forName(namespace).getDeclaredMethods();
-            for (Method method : methods) {
-                SqlParser sqlParser = method.getAnnotation(SqlParser.class);
-                sqlParserInfo = new SqlParserInfo();
-                if (null != sqlParser) {
-                    sqlParserInfo.setFilter(sqlParser.filter());
-                }
-                StringBuilder sid = new StringBuilder();
-                sid.append(namespace).append(".").append(method.getName());
-                sqlParserInfoCache.put(sid.toString(), sqlParserInfo);
-            }
-            // 获取缓存结果
-            return sqlParserInfoCache.get(statementId);
-        } catch (Exception e) {
-            throw new MybatisPlusException("获取 SqlParser 注解信息异常", e);
-        }
+        return sqlParserInfoCache.get(getMappedStatement(metaObject).getId());
     }
 
     /**