Przeglądaj źródła

support customer sqlInjector

hubin 6 lat temu
rodzic
commit
38c25afc82

+ 56 - 14
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisMapperAnnotationBuilder.java

@@ -15,11 +15,50 @@
  */
 package com.baomidou.mybatisplus.core;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
-import org.apache.ibatis.annotations.*;
-import org.apache.ibatis.annotations.ResultMap;
+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 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.binding.BindingException;
 import org.apache.ibatis.binding.MapperMethod;
 import org.apache.ibatis.builder.BuilderException;
@@ -36,7 +75,15 @@ 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.*;
+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.parsing.PropertyParser;
 import org.apache.ibatis.reflection.TypeParameterResolver;
 import org.apache.ibatis.scripting.LanguageDriver;
@@ -47,11 +94,8 @@ import org.apache.ibatis.type.JdbcType;
 import org.apache.ibatis.type.TypeHandler;
 import org.apache.ibatis.type.UnknownTypeHandler;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.*;
-import java.util.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 
 
 /**
@@ -102,11 +146,9 @@ public class MybatisMapperAnnotationBuilder extends MapperAnnotationBuilder {
             assistant.setCurrentNamespace(type.getName());
             parseCache();
             parseCacheRef();
-            Method[] methods = type.getMethods();
             // TODO 注入 CURD 动态 SQL (应该在注解之前注入)
-            if (GlobalConfigUtils.getSuperMapperClass(configuration).isAssignableFrom(type)) {
-                GlobalConfigUtils.getSqlInjector(configuration).inspectInject(assistant, type);
-            }
+            GlobalConfigUtils.getSqlInjector(configuration).inspectInject(assistant, type);
+            Method[] methods = type.getMethods();
             for (Method method : methods) {
                 try {
                     // issue #237

+ 37 - 28
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractSqlInjector.java

@@ -15,15 +15,6 @@
  */
 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.Assert;
-import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
-import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
-import org.apache.ibatis.builder.MapperBuilderAssistant;
-import org.apache.ibatis.session.Configuration;
-
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
@@ -31,6 +22,18 @@ import java.lang.reflect.WildcardType;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.ibatis.builder.MapperBuilderAssistant;
+import org.apache.ibatis.logging.Log;
+import org.apache.ibatis.logging.LogFactory;
+import org.apache.ibatis.session.Configuration;
+
+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;
+
 
 /**
  * SQL 自动注入器
@@ -40,26 +43,31 @@ import java.util.Set;
  */
 public abstract class AbstractSqlInjector implements ISqlInjector {
 
+    private static final Log logger = LogFactory.getLog(AbstractSqlInjector.class);
+
     @Override
     public void inspectInject(MapperBuilderAssistant builderAssistant, Class<?> mapperClass) {
-        String className = mapperClass.toString();
-        Set<String> mapperRegistryCache = GlobalConfigUtils.getMapperRegistryCache(builderAssistant.getConfiguration());
-        if (!mapperRegistryCache.contains(className)) {
-            List<AbstractMethod> methodList = this.getMethodList(mapperClass);
-            Assert.notEmpty(methodList, "No effective injection method was found.");
-            // 循环注入自定义方法
-            Class<?> modelClass = extractModelClass(mapperClass);
-            if (modelClass != null) {
-                TableInfo tableInfo = TableInfoHelper.initTableInfo(builderAssistant, modelClass);
-                methodList.forEach(m -> m.inject(builderAssistant, mapperClass, modelClass, tableInfo));
-            }
-            mapperRegistryCache.add(className);
-            /*
-             * 初始化 SQL 解析
-             */
-            if (GlobalConfigUtils.getGlobalConfig(builderAssistant.getConfiguration()).isSqlParserCache()) {
-                SqlParserHelper.initSqlParserInfoCache(mapperClass);
+        List<AbstractMethod> methodList = this.getMethodList(builderAssistant, mapperClass);
+        if (CollectionUtils.isNotEmpty(methodList)) {
+            String className = mapperClass.toString();
+            Set<String> mapperRegistryCache = GlobalConfigUtils.getMapperRegistryCache(builderAssistant.getConfiguration());
+            if (!mapperRegistryCache.contains(className)) {
+                // 循环注入自定义方法
+                Class<?> modelClass = extractModelClass(mapperClass);
+                if (modelClass != null) {
+                    TableInfo tableInfo = TableInfoHelper.initTableInfo(builderAssistant, modelClass);
+                    methodList.forEach(m -> m.inject(builderAssistant, mapperClass, modelClass, tableInfo));
+                }
+                mapperRegistryCache.add(className);
+                /*
+                 * 初始化 SQL 解析
+                 */
+                if (GlobalConfigUtils.getGlobalConfig(builderAssistant.getConfiguration()).isSqlParserCache()) {
+                    SqlParserHelper.initSqlParserInfoCache(mapperClass);
+                }
             }
+        } else {
+            logger.debug(mapperClass.toString() + ", No effective injection method was found.");
         }
     }
 
@@ -73,10 +81,11 @@ public abstract class AbstractSqlInjector implements ISqlInjector {
      * 获取 注入的方法
      * </p>
      *
-     * @param mapperClass mapper class
+     * @param builderAssistant mybatis MapperBuilderAssistant
+     * @param mapperClass      mapper class
      * @return 注入的方法集合
      */
-    public abstract List<AbstractMethod> getMethodList(Class<?> mapperClass);
+    public abstract List<AbstractMethod> getMethodList(MapperBuilderAssistant builderAssistant, Class<?> mapperClass);
 
     /**
      * 提取泛型模型,多泛型的时候请将泛型T放在第一位

+ 27 - 20
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/DefaultSqlInjector.java

@@ -20,6 +20,8 @@ import static java.util.stream.Collectors.toList;
 import java.util.List;
 import java.util.stream.Stream;
 
+import org.apache.ibatis.builder.MapperBuilderAssistant;
+
 import com.baomidou.mybatisplus.core.injector.methods.Delete;
 import com.baomidou.mybatisplus.core.injector.methods.DeleteBatchByIds;
 import com.baomidou.mybatisplus.core.injector.methods.DeleteById;
@@ -37,6 +39,8 @@ import com.baomidou.mybatisplus.core.injector.methods.SelectOne;
 import com.baomidou.mybatisplus.core.injector.methods.SelectPage;
 import com.baomidou.mybatisplus.core.injector.methods.Update;
 import com.baomidou.mybatisplus.core.injector.methods.UpdateById;
+import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
+import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 
 
 /**
@@ -48,25 +52,28 @@ import com.baomidou.mybatisplus.core.injector.methods.UpdateById;
 public class DefaultSqlInjector extends AbstractSqlInjector {
 
     @Override
-    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
-        return Stream.of(
-            new Insert(),
-            new Delete(),
-            new DeleteByMap(),
-            new DeleteById(),
-            new DeleteBatchByIds(),
-            new Update(),
-            new UpdateById(),
-            new SelectById(),
-            new SelectBatchByIds(),
-            new SelectByMap(),
-            new SelectOne(),
-            new SelectCount(),
-            new SelectMaps(),
-            new SelectMapsPage(),
-            new SelectObjs(),
-            new SelectList(),
-            new SelectPage()
-        ).collect(toList());
+    public List<AbstractMethod> getMethodList(MapperBuilderAssistant builderAssistant, Class<?> mapperClass) {
+        if (GlobalConfigUtils.getSuperMapperClass(builderAssistant.getConfiguration()).isAssignableFrom(mapperClass)) {
+            return Stream.of(
+                new Insert(),
+                new Delete(),
+                new DeleteByMap(),
+                new DeleteById(),
+                new DeleteBatchByIds(),
+                new Update(),
+                new UpdateById(),
+                new SelectById(),
+                new SelectBatchByIds(),
+                new SelectByMap(),
+                new SelectOne(),
+                new SelectCount(),
+                new SelectMaps(),
+                new SelectMapsPage(),
+                new SelectObjs(),
+                new SelectList(),
+                new SelectPage()
+            ).collect(toList());
+        }
+        throw ExceptionUtils.mpe(mapperClass.toString() + ", No effective injection method was found.");
     }
 }