浏览代码

填充器,获取实体映射.增加类型判断(待优化).

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

+ 4 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisDefaultParameterHandler.java

@@ -65,7 +65,10 @@ public class MybatisDefaultParameterHandler extends DefaultParameterHandler {
      */
     protected static Object processBatch(MappedStatement ms, Object parameterObject) {
         //检查 parameterObject
-        if (null == parameterObject) {
+        if (null == parameterObject
+            || ReflectionKit.isPrimitiveOrWrapper(parameterObject.getClass())
+            || parameterObject.getClass() == String.class) {
+            //todo 这里需要处理下类型判断,逻辑删除还会进入这里,但SqlCommandType为UPDATE
             return null;
         }
         // 全局配置是否配置填充器

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

@@ -26,6 +26,7 @@ import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.Collections;
+import java.util.IdentityHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -53,6 +54,19 @@ public class ReflectionKit {
      */
     private static final Map<Class<?>, List<Field>> classFieldCache = new ConcurrentHashMap<>();
 
+    private static final Map<Class<?>, Class<?>> primitiveWrapperTypeMap = new IdentityHashMap<>(8);
+
+    static {
+        primitiveWrapperTypeMap.put(Boolean.class, boolean.class);
+        primitiveWrapperTypeMap.put(Byte.class, byte.class);
+        primitiveWrapperTypeMap.put(Character.class, char.class);
+        primitiveWrapperTypeMap.put(Double.class, double.class);
+        primitiveWrapperTypeMap.put(Float.class, float.class);
+        primitiveWrapperTypeMap.put(Integer.class, int.class);
+        primitiveWrapperTypeMap.put(Long.class, long.class);
+        primitiveWrapperTypeMap.put(Short.class, short.class);
+    }
+
     /**
      * <p>
      * 反射 method 方法名,例如 getId
@@ -224,6 +238,13 @@ public class ReflectionKit {
         return fieldList;
     }
 
+    /**
+     * 获取字段get方法
+     *
+     * @param cls   class
+     * @param field 字段
+     * @return Get方法
+     */
     public static Method getMethod(Class<?> cls, Field field) {
         try {
             return cls.getDeclaredMethod(ReflectionKit.getMethodCapitalize(field, field.getName()));
@@ -231,4 +252,15 @@ public class ReflectionKit {
             throw ExceptionUtils.mpe("Error: NoSuchMethod in %s.  Cause:", e, cls.getName());
         }
     }
+
+    /**
+     * 判断是否为基本类型或基本包装类型
+     *
+     * @param clazz class
+     * @return 是否基本类型或基本包装类型
+     */
+    public static boolean isPrimitiveOrWrapper(Class<?> clazz) {
+        Assert.notNull(clazz, "Class must not be null");
+        return (clazz.isPrimitive() || primitiveWrapperTypeMap.containsKey(clazz));
+    }
 }

+ 3 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/TableInfoHelper.java

@@ -72,7 +72,9 @@ public class TableInfoHelper {
      * @return 数据库表反射信息
      */
     public static TableInfo getTableInfo(Class<?> clazz) {
-        if (clazz == null) {
+        if (clazz == null
+            || ReflectionKit.isPrimitiveOrWrapper(clazz)
+            || clazz == String.class) {
             return null;
         }
         TableInfo tableInfo = TABLE_INFO_CACHE.get(ClassUtils.getUserClass(clazz));

+ 23 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/toolkit/ReflectionKitTest.java

@@ -100,4 +100,27 @@ class ReflectionKitTest {
         Assertions.assertEquals(c.getSex(), ReflectionKit.getMethodValue(c.getClass(), c, "sex"));
         Assertions.assertEquals(c.getAge(), ReflectionKit.getMethodValue(c, "age"));
     }
+
+    @Test
+    void testIsPrimitiveOrWrapper(){
+        Assertions.assertFalse(ReflectionKit.isPrimitiveOrWrapper(String.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(Boolean.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(boolean.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(byte.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(Byte.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(char.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(Character.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(char.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(Character.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(double.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(Double.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(float.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(Float.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(int.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(Integer.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(long.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(Long.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(short.class));
+        Assertions.assertTrue(ReflectionKit.isPrimitiveOrWrapper(Short.class));
+    }
 }