Browse Source

添加单元测试

唐振超 2 years ago
parent
commit
7f015b3039

+ 1 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/config/GlobalConfig.java

@@ -19,7 +19,6 @@ import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.core.handlers.AnnotationHandler;
 import com.baomidou.mybatisplus.core.handlers.AnnotationHandler;
-import com.baomidou.mybatisplus.core.handlers.DefaultAnnotationHandler;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler;
 import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler;
 import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
 import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
@@ -81,7 +80,7 @@ public class GlobalConfig implements Serializable {
     /**
     /**
      * 注解控制器
      * 注解控制器
      */
      */
-    private AnnotationHandler annotationHandler = new DefaultAnnotationHandler();
+    private AnnotationHandler annotationHandler = new AnnotationHandler(){};
     /**
     /**
      * 参与 TableInfo 的初始化
      * 参与 TableInfo 的初始化
      */
      */

+ 37 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/handlers/AnnotationHandler.java

@@ -2,6 +2,7 @@ package com.baomidou.mybatisplus.core.handlers;
 
 
 import java.lang.annotation.Annotation;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 
 
 /**
 /**
  * @author 唐振超
  * @author 唐振超
@@ -17,7 +18,9 @@ public interface AnnotationHandler {
      * @param <T>             具体注解
      * @param <T>             具体注解
      * @return 注解
      * @return 注解
      */
      */
-    <T extends Annotation> T getAnnotation(Class<?> beanClass, Class<T> annotationClass);
+    default <T extends Annotation> T getAnnotation(Class<?> beanClass, Class<T> annotationClass) {
+        return beanClass.getAnnotation(annotationClass);
+    }
 
 
     /**
     /**
      * 判断类上是否存在注解
      * 判断类上是否存在注解
@@ -27,7 +30,9 @@ public interface AnnotationHandler {
      * @param <T>             具体注解
      * @param <T>             具体注解
      * @return 是否包含该注解
      * @return 是否包含该注解
      */
      */
-    <T extends Annotation> boolean isAnnotationPresent(Class<?> beanClass, Class<T> annotationClass);
+    default <T extends Annotation> boolean isAnnotationPresent(Class<?> beanClass, Class<T> annotationClass) {
+        return beanClass.isAnnotationPresent(annotationClass);
+    }
 
 
     /**
     /**
      * 从字段上获取注解
      * 从字段上获取注解
@@ -37,7 +42,9 @@ public interface AnnotationHandler {
      * @param <T>             具体注解
      * @param <T>             具体注解
      * @return 注解
      * @return 注解
      */
      */
-    <T extends Annotation> T getAnnotation(Field field, Class<T> annotationClass);
+    default <T extends Annotation> T getAnnotation(Field field, Class<T> annotationClass) {
+        return field.getAnnotation(annotationClass);
+    }
 
 
     /**
     /**
      * 判断字段上是否存在注解
      * 判断字段上是否存在注解
@@ -47,5 +54,31 @@ public interface AnnotationHandler {
      * @param <T>             具体注解
      * @param <T>             具体注解
      * @return 是否包含该注解
      * @return 是否包含该注解
      */
      */
-    <T extends Annotation> boolean isAnnotationPresent(Field field, Class<T> annotationClass);
+    default <T extends Annotation> boolean isAnnotationPresent(Field field, Class<T> annotationClass) {
+        return field.isAnnotationPresent(annotationClass);
+    }
+
+    /**
+     * 从方法上获取注解
+     *
+     * @param method          方法
+     * @param annotationClass 要获取的注解class
+     * @param <T>             具体注解
+     * @return 注解
+     */
+    default <T extends Annotation> T getAnnotation(Method method, Class<T> annotationClass) {
+        return method.getAnnotation(annotationClass);
+    }
+
+    /**
+     * 判断方法上是否存在注解
+     *
+     * @param method           方法
+     * @param annotationClass 要获取的注解class
+     * @param <T>             具体注解
+     * @return 是否包含该注解
+     */
+    default <T extends Annotation> boolean isAnnotationPresent(Method method, Class<T> annotationClass) {
+        return method.isAnnotationPresent(annotationClass);
+    }
 }
 }

+ 0 - 29
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/handlers/DefaultAnnotationHandler.java

@@ -1,29 +0,0 @@
-package com.baomidou.mybatisplus.core.handlers;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-
-/**
- * @author 唐振超
- */
-public class DefaultAnnotationHandler implements AnnotationHandler {
-    @Override
-    public <T extends Annotation> T getAnnotation(Class<?> beanClass, Class<T> annotationClass) {
-        return beanClass.getAnnotation(annotationClass);
-    }
-
-    @Override
-    public <T extends Annotation> boolean isAnnotationPresent(Class<?> beanClass, Class<T> annotationClass) {
-        return beanClass.isAnnotationPresent(annotationClass);
-    }
-
-    @Override
-    public <T extends Annotation> T getAnnotation(Field field, Class<T> annotationClass) {
-        return field.getAnnotation(annotationClass);
-    }
-
-    @Override
-    public <T extends Annotation> boolean isAnnotationPresent(Field field, Class<T> annotationClass) {
-        return field.isAnnotationPresent(annotationClass);
-    }
-}

+ 8 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/FillPerformanceTest.java

@@ -1,5 +1,6 @@
 package com.baomidou.mybatisplus.test.h2;
 package com.baomidou.mybatisplus.test.h2;
 
 
+import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.test.h2.fillperformance.model.PerformanceModel;
 import com.baomidou.mybatisplus.test.h2.fillperformance.model.PerformanceModel;
 import com.baomidou.mybatisplus.test.h2.fillperformance.service.IPerformanceModelService;
 import com.baomidou.mybatisplus.test.h2.fillperformance.service.IPerformanceModelService;
 import org.junit.jupiter.api.MethodOrderer;
 import org.junit.jupiter.api.MethodOrderer;
@@ -34,4 +35,11 @@ class FillPerformanceTest {
         System.out.println(end - start);
         System.out.println(end - start);
         System.out.println("-------------------------");
         System.out.println("-------------------------");
     }
     }
+
+    @Test
+    void testCustomAnnotation(){
+        PerformanceModel performanceModel = new PerformanceModel();
+        performanceModelService.save(performanceModel);
+        Assert.notEmpty(performanceModel.getA(), "自定义注解获取方式测试失败");
+    }
 }
 }

+ 217 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2AnnotationHandler.java

@@ -0,0 +1,217 @@
+package com.baomidou.mybatisplus.test.h2;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.core.handlers.AnnotationHandler;
+import com.baomidou.mybatisplus.test.h2.fillperformance.annotation.InsertUpdateFill;
+import com.baomidou.mybatisplus.test.h2.fillperformance.model.PerformanceModel;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.TypeHandler;
+import org.apache.ibatis.type.UnknownTypeHandler;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+
+
+public class H2AnnotationHandler implements AnnotationHandler {
+
+    /**
+     * 结合{@link PerformanceModel#getA()}简单实现{@link com.baomidou.mybatisplus.test.h2.fillperformance.annotation.InsertUpdateFill} 的获取过程
+     *
+     * @param field           字段
+     * @param annotationClass 要获取的注解class
+     * @param <T>
+     * @return
+     */
+    @Override
+    public <T extends Annotation> T getAnnotation(Field field, Class<T> annotationClass) {
+
+        T annotation = field.getAnnotation(annotationClass);
+        if (annotationClass != TableField.class) {
+            return annotation;
+        }
+
+        Annotation insertUpdateFillAnno = field.getAnnotation(InsertUpdateFill.class);
+        if (insertUpdateFillAnno == null) {
+            return annotation;
+        }
+
+        /*
+         如果是要获取TableField场景,尝试判断是否存在InsertUpdateFill,存在则假定存在@TableField(fill = FieldFill.INSERT_UPDATE)的配置,
+         实际应用场景,应采取更加通用的方式,例如Spring的AnnotationUtils等
+         */
+        if (annotation != null) {
+            TableField finalAnnotation = (TableField) annotation;
+            annotation = (T) new TableField() {
+                @Override
+                public Class<? extends Annotation> annotationType() {
+                    return finalAnnotation.annotationType();
+                }
+
+                @Override
+                public String value() {
+                    return finalAnnotation.value();
+                }
+
+                @Override
+                public boolean exist() {
+                    return finalAnnotation.exist();
+                }
+
+                @Override
+                public String condition() {
+                    return finalAnnotation.value();
+                }
+
+                @Override
+                public String update() {
+                    return finalAnnotation.update();
+                }
+
+                @Override
+                public FieldStrategy insertStrategy() {
+                    return finalAnnotation.insertStrategy();
+                }
+
+                @Override
+                public FieldStrategy updateStrategy() {
+                    return finalAnnotation.updateStrategy();
+                }
+
+                @Override
+                public FieldStrategy whereStrategy() {
+                    return finalAnnotation.whereStrategy();
+                }
+
+                @Override
+                public FieldFill fill() {
+                    return FieldFill.INSERT_UPDATE;
+                }
+
+                @Override
+                public boolean select() {
+                    return finalAnnotation.select();
+                }
+
+                @Override
+                public boolean keepGlobalFormat() {
+                    return finalAnnotation.keepGlobalFormat();
+                }
+
+                @Override
+                public String property() {
+                    return finalAnnotation.value();
+                }
+
+                @Override
+                public JdbcType jdbcType() {
+                    return finalAnnotation.jdbcType();
+                }
+
+                @Override
+                public Class<? extends TypeHandler> typeHandler() {
+                    return finalAnnotation.typeHandler();
+                }
+
+                @Override
+                public boolean javaType() {
+                    return finalAnnotation.javaType();
+                }
+
+                @Override
+                public String numericScale() {
+                    return finalAnnotation.value();
+                }
+            };
+        } else {
+            annotation = (T) new TableField() {
+                @Override
+                public Class<? extends Annotation> annotationType() {
+                    return TableField.class;
+                }
+
+                @Override
+                public String value() {
+                    return "";
+                }
+
+                @Override
+                public boolean exist() {
+                    return true;
+                }
+
+                @Override
+                public String condition() {
+                    return "";
+                }
+
+                @Override
+                public String update() {
+                    return "";
+                }
+
+                @Override
+                public FieldStrategy insertStrategy() {
+                    return FieldStrategy.DEFAULT;
+                }
+
+                @Override
+                public FieldStrategy updateStrategy() {
+                    return FieldStrategy.DEFAULT;
+                }
+
+                @Override
+                public FieldStrategy whereStrategy() {
+                    return FieldStrategy.DEFAULT;
+                }
+
+                @Override
+                public FieldFill fill() {
+                    return FieldFill.INSERT_UPDATE;
+                }
+
+                @Override
+                public boolean select() {
+                    return true;
+                }
+
+                @Override
+                public boolean keepGlobalFormat() {
+                    return false;
+                }
+
+                @Override
+                public String property() {
+                    return "";
+                }
+
+                @Override
+                public JdbcType jdbcType() {
+                    return JdbcType.UNDEFINED;
+                }
+
+                @Override
+                public Class<? extends TypeHandler> typeHandler() {
+                    return UnknownTypeHandler.class;
+                }
+
+                @Override
+                public boolean javaType() {
+                    return false;
+                }
+
+                @Override
+                public String numericScale() {
+                    return "";
+                }
+            };
+        }
+        return annotation;
+    }
+
+    @Override
+    public <T extends Annotation> boolean isAnnotationPresent(Field field, Class<T> annotationClass) {
+        return getAnnotation(field, annotationClass) != null;
+    }
+}

+ 2 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/config/MybatisPlusConfig.java

@@ -28,6 +28,7 @@ import com.baomidou.mybatisplus.extension.plugins.inner.DataChangeRecorderInnerI
 import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
 import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
 import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
+import com.baomidou.mybatisplus.test.h2.H2AnnotationHandler;
 import com.baomidou.mybatisplus.test.h2.H2MetaObjectHandler;
 import com.baomidou.mybatisplus.test.h2.H2MetaObjectHandler;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -73,6 +74,7 @@ public class MybatisPlusConfig {
         sqlSessionFactory.setPlugins(mybatisPlusInterceptor);
         sqlSessionFactory.setPlugins(mybatisPlusInterceptor);
 
 
         globalConfig.setMetaObjectHandler(new H2MetaObjectHandler());
         globalConfig.setMetaObjectHandler(new H2MetaObjectHandler());
+        globalConfig.setAnnotationHandler(new H2AnnotationHandler());
         globalConfig.setSqlInjector(new DefaultSqlInjector() {
         globalConfig.setSqlInjector(new DefaultSqlInjector() {
 
 
             /**
             /**

+ 13 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/fillperformance/annotation/InsertUpdateFill.java

@@ -0,0 +1,13 @@
+package com.baomidou.mybatisplus.test.h2.fillperformance.annotation;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.lang.annotation.*;
+
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+@TableField(fill = FieldFill.INSERT_UPDATE)
+public @interface InsertUpdateFill {
+}

+ 4 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/fillperformance/model/PerformanceModel.java

@@ -3,11 +3,15 @@ package com.baomidou.mybatisplus.test.h2.fillperformance.model;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.test.h2.fillperformance.annotation.InsertUpdateFill;
+import lombok.Data;
 
 
+@Data
 @TableName(value = "t_fill_performance")
 @TableName(value = "t_fill_performance")
 public class PerformanceModel {
 public class PerformanceModel {
 
 
     private Long id;
     private Long id;
+    @InsertUpdateFill
     private String a;
     private String a;
     private String b;
     private String b;
     @TableField(fill = FieldFill.INSERT_UPDATE)
     @TableField(fill = FieldFill.INSERT_UPDATE)