浏览代码

优化枚举处理.

nieqiuqiu 6 年之前
父节点
当前提交
bb726ee033

+ 4 - 5
build.gradle.kts

@@ -121,14 +121,13 @@ subprojects {
         annotationProcessor("${lib["lombok"]}")
         compileOnly("${lib["lombok"]}")
 
-        testCompileOnly("${lib["lombok"]}")
         testAnnotationProcessor("${lib["lombok"]}")
-        testCompileOnly("${lib["mockito-all"]}")
-        testRuntimeOnly("${lib["junit-jupiter-engine"]}")
-        testImplementation("${lib["lagarto"]}")
-        testImplementation("${lib["spring-test"]}")
+        testCompileOnly("${lib["lombok"]}")
         testImplementation("${lib["junit-jupiter-api"]}")
+        testRuntimeOnly("${lib["junit-jupiter-engine"]}")
+        testCompileOnly("${lib["mockito-all"]}")
         testImplementation("org.mockito:mockito-junit-jupiter:2.24.0")
+        testImplementation("${lib["lagarto"]}")
     }
 
     val sourcesJar by tasks.registering(Jar::class) {

+ 2 - 2
mybatis-plus-boot-starter/src/test/java/com/baomidou/mybatisplus/starter/pom/GeneratePomTest.java

@@ -7,8 +7,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
-import org.springframework.core.io.FileSystemResource;
 
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
@@ -31,7 +31,7 @@ class GeneratePomTest {
     
     @Test
     void test() throws IOException {
-        InputStream inputStream = new FileSystemResource("build/publications/mavenJava/pom-default.xml").getInputStream();
+        InputStream inputStream = new FileInputStream("build/publications/mavenJava/pom-default.xml");
         Jerry.JerryParser jerryParser = new Jerry.JerryParser(new LagartoDOMBuilder().enableXmlMode());
         Jerry doc = jerryParser.parse(FileUtil.readUTFString(inputStream));
         Jerry dependencies = doc.$("dependencies dependency");

+ 11 - 23
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/EnumUtils.java

@@ -16,11 +16,11 @@
 package com.baomidou.mybatisplus.core.toolkit;
 
 
-import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.util.Objects;
 
-import com.baomidou.mybatisplus.core.enums.IEnum;
 
 /**
  * 枚举处理工具类
@@ -35,13 +35,20 @@ public class EnumUtils {
      *
      * @param enumClass 枚举类
      * @param value     枚举值
+     * @param method    取值方法
      * @param <E>       对应枚举
      * @return
      */
-    public static <E extends Enum<?> & IEnum> E valueOf(Class<E> enumClass, Object value) {
+    public static <E extends Enum<?>> E valueOf(Class<E> enumClass, Object value, Method method) {
         E[] es = enumClass.getEnumConstants();
         for (E e : es) {
-            Object evalue = e.getValue();
+            Object evalue;
+            try {
+                method.setAccessible(true);
+                evalue = method.invoke(e);
+            } catch (IllegalAccessException | InvocationTargetException e1) {
+                throw ExceptionUtils.mpe("Error: NoSuchMethod in %s.  Cause:", e, enumClass.getName());
+            }
             if (value instanceof Number && evalue instanceof Number
                 && new BigDecimal(String.valueOf(value)).compareTo(new BigDecimal(String.valueOf(evalue))) == 0) {
                 return e;
@@ -53,23 +60,4 @@ public class EnumUtils {
         return null;
     }
 
-    public static <E extends Enum<?>> E valueOf(Class<E> enumClass, Object value, Field enumField) {
-        E[] es = enumClass.getEnumConstants();
-        for (E e : es) {
-            try {
-                Object evalue = enumField.get(e);
-                if (value instanceof Number && evalue instanceof Number
-                    && new BigDecimal(String.valueOf(value)).compareTo(new BigDecimal(String.valueOf(evalue))) == 0) {
-                    return e;
-                }
-                if (Objects.equals(evalue, value)) {
-                    return e;
-                }
-            } catch (IllegalAccessException ignored) {
-
-            }
-        }
-        return null;
-    }
-
 }

+ 8 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/ReflectionKit.java

@@ -206,4 +206,12 @@ public class ReflectionKit {
         superFieldList.stream().filter(field -> !fieldMap.containsKey(field.getName())).forEach(fieldList::add);
         return fieldList;
     }
+
+    public static Method getMethod(Class<?> cls, Field field) {
+        try {
+            return cls.getDeclaredMethod(ReflectionKit.getMethodCapitalize(field, field.getName()));
+        } catch (NoSuchMethodException e) {
+            throw ExceptionUtils.mpe("Error: NoSuchMethod in %s.  Cause:", e, cls.getName());
+        }
+    }
 }

+ 2 - 2
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/pom/GeneratePomTest.java

@@ -7,8 +7,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
-import org.springframework.core.io.FileSystemResource;
 
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
@@ -31,7 +31,7 @@ class GeneratePomTest {
     
     @Test
     void test() throws IOException {
-        InputStream inputStream = new FileSystemResource("build/publications/mavenJava/pom-default.xml").getInputStream();
+        InputStream inputStream = new FileInputStream("build/publications/mavenJava/pom-default.xml");
         Jerry.JerryParser jerryParser = new Jerry.JerryParser(new LagartoDOMBuilder().enableXmlMode());
         Jerry doc = jerryParser.parse(FileUtil.readUTFString(inputStream));
         Jerry dependencies = doc.$("dependencies dependency");

+ 13 - 13
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/handlers/EnumAnnotationTypeHandler.java

@@ -15,6 +15,15 @@
  */
 package com.baomidou.mybatisplus.extension.handlers;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.baomidou.mybatisplus.core.toolkit.EnumUtils;
+import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
+
+import org.apache.ibatis.logging.Log;
+import org.apache.ibatis.logging.LogFactory;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+
 import java.lang.reflect.Field;
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
@@ -25,14 +34,6 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
-import com.baomidou.mybatisplus.annotation.EnumValue;
-import org.apache.ibatis.logging.Log;
-import org.apache.ibatis.logging.LogFactory;
-import org.apache.ibatis.type.BaseTypeHandler;
-import org.apache.ibatis.type.JdbcType;
-
-import com.baomidou.mybatisplus.core.toolkit.EnumUtils;
-
 /**
  * EnumValue 注解自定义枚举属性转换器
  *
@@ -54,9 +55,9 @@ public class EnumAnnotationTypeHandler<E extends Enum<E>> extends BaseTypeHandle
 
     private static final Map<Class<?>, Field> TABLE_FIELD_OF_ENUM_TYPES = new ConcurrentHashMap<>();
 
-    public static void addEnumType(Class<?> clazz, Field tableFieldOfEnumType) {
-        tableFieldOfEnumType.setAccessible(true);
-        TABLE_FIELD_OF_ENUM_TYPES.put(clazz, tableFieldOfEnumType);
+    public static void addEnumType(Class<?> clazz, Field field) {
+        field.setAccessible(true);
+        TABLE_FIELD_OF_ENUM_TYPES.put(clazz, field);
     }
 
 
@@ -84,8 +85,7 @@ public class EnumAnnotationTypeHandler<E extends Enum<E>> extends BaseTypeHandle
         if (s == null) {
             return null;
         }
-        Field tableEnumField = getField(type);
-        return EnumUtils.valueOf(type, s, tableEnumField);
+        return EnumUtils.valueOf(type, s, ReflectionKit.getMethod(type, getField(type)));
     }
 
     @Override

+ 17 - 9
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/handlers/EnumTypeHandler.java

@@ -15,16 +15,17 @@
  */
 package com.baomidou.mybatisplus.extension.handlers;
 
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
+import com.baomidou.mybatisplus.core.enums.IEnum;
+import com.baomidou.mybatisplus.core.toolkit.EnumUtils;
 
 import org.apache.ibatis.type.BaseTypeHandler;
 import org.apache.ibatis.type.JdbcType;
 
-import com.baomidou.mybatisplus.core.enums.IEnum;
-import com.baomidou.mybatisplus.core.toolkit.EnumUtils;
+import java.lang.reflect.Method;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 
 /**
  * 自定义枚举属性转换器
@@ -36,6 +37,8 @@ public class EnumTypeHandler<E extends Enum<?> & IEnum> extends BaseTypeHandler<
 
     private Class<E> type;
 
+    private Method method;
+
     public EnumTypeHandler(Class<E> type) {
         if (type == null) {
             throw new IllegalArgumentException("Type argument cannot be null");
@@ -44,6 +47,11 @@ public class EnumTypeHandler<E extends Enum<?> & IEnum> extends BaseTypeHandler<
             throw new IllegalArgumentException("当前[" + type.getName() + "]枚举类未实现" + IEnum.class.getName() + "接口");
         }
         this.type = type;
+        try {
+            method = type.getMethod("getValue");
+        } catch (NoSuchMethodException e) {
+            throw new IllegalArgumentException("当前[" + type.getName() + "]枚举类未找到getValue方法");
+        }
     }
 
     @Override
@@ -61,7 +69,7 @@ public class EnumTypeHandler<E extends Enum<?> & IEnum> extends BaseTypeHandler<
         if (null == rs.getObject(columnName) && rs.wasNull()) {
             return null;
         }
-        return EnumUtils.valueOf(type, rs.getObject(columnName));
+        return EnumUtils.valueOf(type, rs.getObject(columnName), method);
     }
 
     @Override
@@ -69,7 +77,7 @@ public class EnumTypeHandler<E extends Enum<?> & IEnum> extends BaseTypeHandler<
         if (null == rs.getObject(columnIndex) && rs.wasNull()) {
             return null;
         }
-        return EnumUtils.valueOf(type, rs.getObject(columnIndex));
+        return EnumUtils.valueOf(type, rs.getObject(columnIndex), method);
     }
 
     @Override
@@ -77,6 +85,6 @@ public class EnumTypeHandler<E extends Enum<?> & IEnum> extends BaseTypeHandler<
         if (null == cs.getObject(columnIndex) && cs.wasNull()) {
             return null;
         }
-        return EnumUtils.valueOf(type, cs.getObject(columnIndex));
+        return EnumUtils.valueOf(type, cs.getObject(columnIndex), method);
     }
 }

+ 2 - 2
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/pom/GeneratePomTest.java

@@ -7,8 +7,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
-import org.springframework.core.io.FileSystemResource;
 
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
@@ -31,7 +31,7 @@ class GeneratePomTest {
     
     @Test
     void test() throws IOException {
-        InputStream inputStream = new FileSystemResource("build/publications/mavenJava/pom-default.xml").getInputStream();
+        InputStream inputStream = new FileInputStream("build/publications/mavenJava/pom-default.xml");
         Jerry.JerryParser jerryParser = new Jerry.JerryParser(new LagartoDOMBuilder().enableXmlMode());
         Jerry doc = jerryParser.parse(FileUtil.readUTFString(inputStream));
         Jerry dependencies = doc.$("dependencies dependency");

+ 2 - 2
mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/test/generator/pom/GeneratePomTest.java

@@ -7,8 +7,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
-import org.springframework.core.io.FileSystemResource;
 
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
@@ -31,7 +31,7 @@ class GeneratePomTest {
     
     @Test
     void test() throws IOException {
-        InputStream inputStream = new FileSystemResource("build/publications/mavenJava/pom-default.xml").getInputStream();
+        InputStream inputStream = new FileInputStream("build/publications/mavenJava/pom-default.xml");
         Jerry.JerryParser jerryParser = new Jerry.JerryParser(new LagartoDOMBuilder().enableXmlMode());
         Jerry doc = jerryParser.parse(FileUtil.readUTFString(inputStream));
         Jerry dependencies = doc.$("dependencies dependency");

+ 1 - 0
mybatis-plus/build.gradle.kts

@@ -7,6 +7,7 @@ dependencies {
     testImplementation("${lib["spring-web"]}")
     testImplementation("${lib["javax.servlet-api"]}")
 
+    testImplementation("${lib["spring-test"]}")
     testImplementation("${lib["fastjson"]}")
 
     testImplementation("${lib["hikaricp"]}")

+ 2 - 2
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/pom/GeneratePomTest.java

@@ -7,8 +7,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
-import org.springframework.core.io.FileSystemResource;
 
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
@@ -31,7 +31,7 @@ class GeneratePomTest {
     
     @Test
     void test() throws IOException {
-        InputStream inputStream = new FileSystemResource("build/publications/mavenJava/pom-default.xml").getInputStream();
+        InputStream inputStream = new FileInputStream("build/publications/mavenJava/pom-default.xml");
         Jerry.JerryParser jerryParser = new Jerry.JerryParser(new LagartoDOMBuilder().enableXmlMode());
         Jerry doc = jerryParser.parse(FileUtil.readUTFString(inputStream));
         Jerry dependencies = doc.$("dependencies dependency");