浏览代码

[优化] SqlParser注解不再需要全局设置参数才会缓存,注入crud放在最后,可以允许继承接口自己在上面加注解

miemie 6 年之前
父节点
当前提交
2092163be5

+ 18 - 60
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisMapperAnnotationBuilder.java

@@ -15,50 +15,12 @@
  */
 package com.baomidou.mybatisplus.core;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Array;
-import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Properties;
-import java.util.Set;
-
-import org.apache.ibatis.annotations.Arg;
-import org.apache.ibatis.annotations.CacheNamespace;
-import org.apache.ibatis.annotations.CacheNamespaceRef;
-import org.apache.ibatis.annotations.Case;
-import org.apache.ibatis.annotations.ConstructorArgs;
-import org.apache.ibatis.annotations.Delete;
-import org.apache.ibatis.annotations.DeleteProvider;
-import org.apache.ibatis.annotations.Insert;
-import org.apache.ibatis.annotations.InsertProvider;
-import org.apache.ibatis.annotations.Lang;
-import org.apache.ibatis.annotations.MapKey;
-import org.apache.ibatis.annotations.Options;
-import org.apache.ibatis.annotations.Options.FlushCachePolicy;
-import org.apache.ibatis.annotations.Property;
-import org.apache.ibatis.annotations.Result;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.parser.SqlParserHelper;
+import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
+import org.apache.ibatis.annotations.*;
 import org.apache.ibatis.annotations.ResultMap;
-import org.apache.ibatis.annotations.ResultType;
-import org.apache.ibatis.annotations.Results;
-import org.apache.ibatis.annotations.Select;
-import org.apache.ibatis.annotations.SelectKey;
-import org.apache.ibatis.annotations.SelectProvider;
-import org.apache.ibatis.annotations.TypeDiscriminator;
-import org.apache.ibatis.annotations.Update;
-import org.apache.ibatis.annotations.UpdateProvider;
+import org.apache.ibatis.annotations.Options.FlushCachePolicy;
 import org.apache.ibatis.binding.BindingException;
 import org.apache.ibatis.binding.MapperMethod;
 import org.apache.ibatis.builder.BuilderException;
@@ -75,27 +37,21 @@ import org.apache.ibatis.executor.keygen.KeyGenerator;
 import org.apache.ibatis.executor.keygen.NoKeyGenerator;
 import org.apache.ibatis.executor.keygen.SelectKeyGenerator;
 import org.apache.ibatis.io.Resources;
-import org.apache.ibatis.mapping.Discriminator;
-import org.apache.ibatis.mapping.FetchType;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.ResultFlag;
-import org.apache.ibatis.mapping.ResultMapping;
-import org.apache.ibatis.mapping.ResultSetType;
-import org.apache.ibatis.mapping.SqlCommandType;
-import org.apache.ibatis.mapping.SqlSource;
-import org.apache.ibatis.mapping.StatementType;
+import org.apache.ibatis.mapping.*;
 import org.apache.ibatis.parsing.PropertyParser;
 import org.apache.ibatis.reflection.TypeParameterResolver;
 import org.apache.ibatis.scripting.LanguageDriver;
-import org.apache.ibatis.session.Configuration;
 import org.apache.ibatis.session.ResultHandler;
 import org.apache.ibatis.session.RowBounds;
 import org.apache.ibatis.type.JdbcType;
 import org.apache.ibatis.type.TypeHandler;
 import org.apache.ibatis.type.UnknownTypeHandler;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.*;
+import java.util.*;
 
 
 /**
@@ -125,11 +81,11 @@ public class MybatisMapperAnnotationBuilder extends MapperAnnotationBuilder {
         SQL_PROVIDER_ANNOTATION_TYPES.add(DeleteProvider.class);
     }
 
-    private final Configuration configuration;
+    private final MybatisConfiguration configuration;
     private final MapperBuilderAssistant assistant;
     private final Class<?> type;
 
-    public MybatisMapperAnnotationBuilder(Configuration configuration, Class<?> type) {
+    public MybatisMapperAnnotationBuilder(MybatisConfiguration configuration, Class<?> type) {
         super(configuration, type);
         String resource = type.getName().replace('.', '/') + ".java (best guess)";
         this.assistant = new MapperBuilderAssistant(configuration, resource);
@@ -143,23 +99,25 @@ public class MybatisMapperAnnotationBuilder extends MapperAnnotationBuilder {
         if (!configuration.isResourceLoaded(resource)) {
             loadXmlResource();
             configuration.addLoadedResource(resource);
-            assistant.setCurrentNamespace(type.getName());
+            final String typeName = type.getName();
+            assistant.setCurrentNamespace(typeName);
             parseCache();
             parseCacheRef();
-            // TODO 注入 CURD 动态 SQL (应该在注解之前注入)
-            GlobalConfigUtils.getSqlInjector(configuration).inspectInject(assistant, type);
             Method[] methods = type.getMethods();
             for (Method method : methods) {
                 try {
                     // issue #237
                     if (!method.isBridge()) {
                         parseStatement(method);
+                        SqlParserHelper.initSqlParserInfoCache(typeName, method);
                     }
                 } catch (IncompleteElementException e) {
                     // TODO 使用 MybatisMethodResolver 而不是 MethodResolver
                     configuration.addIncompleteMethod(new MybatisMethodResolver(this, method));
                 }
             }
+            // TODO 注入 CURD 动态 SQL , 放在在最后, because 可能会有人会用注解重写sql
+            GlobalConfigUtils.getSqlInjector(configuration).inspectInject(assistant, type);
         }
         parsePendingMethods();
     }

+ 2 - 3
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisMapperRegistry.java

@@ -19,7 +19,6 @@ import com.baomidou.mybatisplus.core.override.MybatisMapperProxyFactory;
 import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 import org.apache.ibatis.binding.BindingException;
 import org.apache.ibatis.binding.MapperRegistry;
-import org.apache.ibatis.session.Configuration;
 import org.apache.ibatis.session.SqlSession;
 
 import java.util.Collection;
@@ -36,9 +35,9 @@ import java.util.Map;
 public class MybatisMapperRegistry extends MapperRegistry {
 
     private final Map<Class<?>, MybatisMapperProxyFactory<?>> knownMappers = new HashMap<>();
-    private final Configuration config;
+    private final MybatisConfiguration config;
 
-    public MybatisMapperRegistry(Configuration config) {
+    public MybatisMapperRegistry(MybatisConfiguration config) {
         super(config);
         this.config = config;
         // 注入SqlRunner

+ 4 - 3
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractMethod.java

@@ -21,6 +21,8 @@ import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import org.apache.ibatis.builder.MapperBuilderAssistant;
 import org.apache.ibatis.executor.keygen.KeyGenerator;
 import org.apache.ibatis.executor.keygen.NoKeyGenerator;
+import org.apache.ibatis.logging.Log;
+import org.apache.ibatis.logging.LogFactory;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.SqlCommandType;
 import org.apache.ibatis.mapping.SqlSource;
@@ -35,6 +37,7 @@ import org.apache.ibatis.session.Configuration;
  * @since 2018-04-06
  */
 public abstract class AbstractMethod implements Constants {
+    protected static final Log logger = LogFactory.getLog(AbstractMethod.class);
 
     protected Configuration configuration;
     protected LanguageDriver languageDriver;
@@ -256,7 +259,7 @@ public abstract class AbstractMethod implements Constants {
                                                  String keyProperty, String keyColumn) {
         String statementName = mapperClass.getName() + DOT + id;
         if (hasMappedStatement(statementName)) {
-            System.err.println(LEFT_BRACE + statementName + "} Has been loaded by XML or SqlProvider, ignoring the injection of the SQL.");
+            logger.warn(LEFT_SQ_BRACKET + statementName + "] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [" + getClass() + RIGHT_SQ_BRACKET);
             return null;
         }
         /* 缓存逻辑处理 */
@@ -279,6 +282,4 @@ public abstract class AbstractMethod implements Constants {
      * @return MappedStatement
      */
     public abstract MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo);
-
-
 }

+ 0 - 8
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractSqlInjector.java

@@ -16,12 +16,10 @@
 package com.baomidou.mybatisplus.core.injector;
 
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import com.baomidou.mybatisplus.core.parser.SqlParserHelper;
 import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
-
 import org.apache.ibatis.builder.MapperBuilderAssistant;
 import org.apache.ibatis.logging.Log;
 import org.apache.ibatis.logging.LogFactory;
@@ -61,12 +59,6 @@ public abstract class AbstractSqlInjector implements ISqlInjector {
                     logger.debug(mapperClass.toString() + ", No effective injection method was found.");
                 }
                 mapperRegistryCache.add(className);
-                /*
-                 * 初始化 SQL 解析
-                 */
-                if (GlobalConfigUtils.getGlobalConfig(builderAssistant.getConfiguration()).isSqlParserCache()) {
-                    SqlParserHelper.initSqlParserInfoCache(mapperClass);
-                }
             }
         }
     }

+ 14 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/parser/SqlParserHelper.java

@@ -55,6 +55,20 @@ public class SqlParserHelper {
         }
     }
 
+    /**
+     * 初始化缓存 SqlParser 注解信息
+     *
+     * @param mapperClassName Mapper Class Name
+     * @param method          Method
+     */
+    public static void initSqlParserInfoCache(String mapperClassName, Method method) {
+        SqlParser sqlParser = method.getAnnotation(SqlParser.class);
+        if (null != sqlParser) {
+            String sid = mapperClassName + StringPool.DOT + method.getName();
+            SQL_PARSER_INFO_CACHE.put(sid, sqlParser.filter());
+        }
+    }
+
 
     /**
      * 获取 SqlParser 注解信息

+ 20 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/mapper/commons/ResultMapEntityMapper.java

@@ -15,11 +15,30 @@
  */
 package com.baomidou.mybatisplus.test.base.mapper.commons;
 
+import com.baomidou.mybatisplus.annotation.SqlParser;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.test.base.entity.ResultMapEntity;
 import com.baomidou.mybatisplus.test.base.mapper.MyBaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.ResultMap;
+import org.apache.ibatis.annotations.Select;
+
+import java.io.Serializable;
 
 /**
  * @author miemie
  * @since 2019-01-19
  */
-public interface ResultMapEntityMapper extends MyBaseMapper<ResultMapEntity> {}
+public interface ResultMapEntityMapper extends MyBaseMapper<ResultMapEntity> {
+
+    @Override
+    @SqlParser
+    @ResultMap("resultChildren1")
+    @Select("select * from result_map_entity where id = #{id}")
+    ResultMapEntity selectById(Serializable id);
+
+    @Override
+    @SqlParser
+    ResultMapEntity selectOne(@Param(Constants.WRAPPER) Wrapper<ResultMapEntity> queryWrapper);
+}