Ver Fonte

TableField.java 增加一个新的属性 typeHandlerStr

miemie há 5 anos atrás
pai
commit
124b543f67

+ 10 - 1
mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/TableField.java

@@ -123,7 +123,7 @@ public @interface TableField {
     JdbcType jdbcType() default JdbcType.UNDEFINED;
 
     /**
-     * 类型处理器 (该默认值不代表会按照该值生效)
+     * 类型处理器 (该默认值不代表会按照该值生效)(和下面的都配置情况下,这个优先)
      * <p>
      * {@link ResultMapping#typeHandler} and {@link ParameterMapping#typeHandler}
      *
@@ -131,6 +131,15 @@ public @interface TableField {
      */
     Class<? extends TypeHandler<?>> typeHandler() default UnknownTypeHandler.class;
 
+    /**
+     * 类型处理器 (该默认值不代表会按照该值生效)(和上面的都配置情况下,上面的优先)
+     * <p>
+     * {@link ResultMapping#typeHandler} and {@link ParameterMapping#typeHandler}
+     *
+     * @since 3.1.2
+     */
+    String typeHandlerStr() default "";
+
     /**
      * 指定小数点后保留的位数
      * <p>

+ 7 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableFieldInfo.java

@@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.core.MybatisConfiguration;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import lombok.AccessLevel;
@@ -148,8 +149,9 @@ public class TableFieldInfo implements Constants {
         this.fieldFill = tableField.fill();
         this.update = tableField.update();
         JdbcType jdbcType = tableField.jdbcType();
-        Class<? extends TypeHandler<?>> typeHandler = tableField.typeHandler();
-        String numericScale = tableField.numericScale();
+        final Class<? extends TypeHandler<?>> typeHandler = tableField.typeHandler();
+        final String handlerStr = tableField.typeHandlerStr();
+        final String numericScale = tableField.numericScale();
         String el = this.property;
         if (JdbcType.UNDEFINED != jdbcType) {
             this.jdbcType = jdbcType;
@@ -158,6 +160,9 @@ public class TableFieldInfo implements Constants {
         if (UnknownTypeHandler.class != typeHandler) {
             this.typeHandler = typeHandler;
             el += (COMMA + "typeHandler=" + typeHandler.getName());
+        } else if (StringUtils.isNotEmpty(handlerStr)) {
+            this.typeHandler = ReflectionKit.getClass(handlerStr);
+            el += (COMMA + "typeHandler=" + this.typeHandler.getName());
         }
         if (StringUtils.isNotEmpty(numericScale)) {
             el += (COMMA + "numericScale=" + numericScale);

+ 13 - 19
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableInfo.java

@@ -15,34 +15,28 @@
  */
 package com.baomidou.mybatisplus.core.metadata;
 
-import static java.util.stream.Collectors.joining;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.function.Predicate;
-
-import org.apache.ibatis.mapping.ResultFlag;
-import org.apache.ibatis.mapping.ResultMap;
-import org.apache.ibatis.mapping.ResultMapping;
-import org.apache.ibatis.session.Configuration;
-
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.core.MybatisConfiguration;
-import com.baomidou.mybatisplus.core.toolkit.Assert;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.Constants;
-import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.*;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
-
 import lombok.AccessLevel;
 import lombok.Data;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
+import org.apache.ibatis.mapping.ResultFlag;
+import org.apache.ibatis.mapping.ResultMap;
+import org.apache.ibatis.mapping.ResultMapping;
+import org.apache.ibatis.session.Configuration;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Predicate;
+
+import static java.util.stream.Collectors.joining;
 
 /**
  * 数据库表反射信息

+ 24 - 17
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/ReflectionKit.java

@@ -15,28 +15,20 @@
  */
 package com.baomidou.mybatisplus.core.toolkit;
 
-import static java.util.function.Function.identity;
-import static java.util.stream.Collectors.toCollection;
-import static java.util.stream.Collectors.toMap;
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
+import org.apache.ibatis.io.Resources;
+import org.apache.ibatis.logging.Log;
+import org.apache.ibatis.logging.LogFactory;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-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;
-import java.util.Objects;
+import java.lang.reflect.*;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.ibatis.logging.Log;
-import org.apache.ibatis.logging.LogFactory;
+import static java.util.function.Function.identity;
+import static java.util.stream.Collectors.toCollection;
+import static java.util.stream.Collectors.toMap;
 
 /**
  * <p>
@@ -263,4 +255,19 @@ public class ReflectionKit {
         Assert.notNull(clazz, "Class must not be null");
         return (clazz.isPrimitive() || PRIMITIVE_WRAPPER_TYPE_MAP.containsKey(clazz));
     }
+
+    /**
+     * 判断是否为基本类型或基本包装类型
+     *
+     * @param className className
+     * @return class
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> Class<T> getClass(String className) {
+        try {
+            return (Class<T>) Resources.classForName(className);
+        } catch (ClassNotFoundException e) {
+            throw new MybatisPlusException("can not fine class of " + className);
+        }
+    }
 }

+ 14 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/BaseDbTest.java

@@ -95,7 +95,7 @@ public abstract class BaseDbTest {
             commonDataMapper.insert(new CommonData().setTestInt(i).setTestStr(str).setId(id)
                 .setTestEnum(TestEnum.ONE));
             commonLogicDataMapper.insert(new CommonLogicData().setTestInt(i).setTestStr(str).setId(id));
-            resultMapEntityMapper.insert(new ResultMapEntity().setId(id).setList(list).setMap(map));
+            resultMapEntityMapper.insert(new ResultMapEntity().setId(id).setList(list).setMap(map).setMapp(map));
             this.insertForeach(id, i, str);
         }
     }
@@ -222,6 +222,7 @@ public abstract class BaseDbTest {
         ResultMapEntity resultMapEntity = resultMapEntityMapper.selectById(id);
         assertNotNull(resultMapEntity);
         assertTrue(CollectionUtils.isNotEmpty(resultMapEntity.getMap()));
+        assertTrue(CollectionUtils.isNotEmpty(resultMapEntity.getMapp()));
         assertTrue(CollectionUtils.isNotEmpty(resultMapEntity.getList()));
         this.selectById(id);
     }
@@ -287,6 +288,14 @@ public abstract class BaseDbTest {
         assertThat(commonLogicData).isNotEmpty();
         assertThat(commonLogicData.get(0)).isNotNull();
 
+        List<ResultMapEntity> resultMapEntities = resultMapEntityMapper.selectList(Wrappers.<ResultMapEntity>lambdaQuery()
+            .eq(ResultMapEntity::getId, id));
+        assertThat(resultMapEntities).isNotEmpty();
+        assertThat(resultMapEntities.get(0)).isNotNull();
+        assertThat(resultMapEntities.get(0).getList()).isNotEmpty();
+        assertThat(resultMapEntities.get(0).getMap()).isNotEmpty();
+        assertThat(resultMapEntities.get(0).getMapp()).isNotEmpty();
+
         this.selectList(id);
     }
 
@@ -302,6 +311,10 @@ public abstract class BaseDbTest {
         assertThat(commonLogicMaps).isNotEmpty();
         assertThat(commonLogicMaps.get(0)).isNotEmpty();
 
+        List<Map<String, Object>> resultMapEntityMaps = resultMapEntityMapper.selectMaps(Wrappers.query());
+        assertThat(resultMapEntityMaps).isNotEmpty();
+        assertThat(resultMapEntityMaps.get(0)).isNotEmpty();
+
         this.selectMaps();
     }
 

+ 2 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/entity/ResultMapEntity.java

@@ -45,4 +45,6 @@ public class ResultMapEntity {
     private List<String> list;
     @TableField(typeHandler = MapTypeHandler.class)
     private Map<String, Object> map;
+    @TableField(typeHandlerStr = "com.baomidou.mybatisplus.test.base.type.JsonTypeHandler")
+    private Map<String, Object> mapp;
 }

+ 57 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/type/JsonTypeHandler.java

@@ -0,0 +1,57 @@
+package com.baomidou.mybatisplus.test.base.type;
+
+import com.alibaba.fastjson.JSON;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * 添加mybatis json类型装换支持
+ * https://github.com/mybatis/mybatis-3/pull/1003
+ */
+public class JsonTypeHandler<T> extends BaseTypeHandler<T> {
+
+    private Class<T> type;
+
+    public JsonTypeHandler(Class<T> type) {
+        if (type == null) {
+            throw new IllegalArgumentException("Type argument cannot be null");
+        }
+        System.out.println("我被构造了,类型" + type);
+        this.type = type;
+    }
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
+        ps.setString(i, JSON.toJSONString(parameter));
+    }
+
+    @Override
+    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        String value = rs.getString(columnName);
+        if (value != null)
+            return JSON.parseObject(value, type);
+        return null;
+    }
+
+    @Override
+    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        String value = rs.getString(columnIndex);
+        if (value != null)
+            return JSON.parseObject(value, type);
+        return null;
+    }
+
+    @Override
+    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        String value = cs.getString(columnIndex);
+        if (value != null)
+            return JSON.parseObject(value, type);
+        return null;
+    }
+
+}

+ 1 - 0
mybatis-plus/src/test/resources/mapper/ResultMapEntityMapper.xml

@@ -14,5 +14,6 @@
         <result column="column4" property="column4"/>
         <result column="list" property="list" typeHandler="com.baomidou.mybatisplus.test.base.type.ListTypeHandler"/>
         <result column="map" property="map" typeHandler="com.baomidou.mybatisplus.test.base.type.MapTypeHandler"/>
+        <result column="map" property="mapp" typeHandler="com.baomidou.mybatisplus.test.base.type.JsonTypeHandler"/>
     </resultMap>
 </mapper>

+ 8 - 7
mybatis-plus/src/test/resources/mysql/test_data.ddl.sql

@@ -37,13 +37,14 @@ CREATE TABLE mysql_data (
 DEFAULT CHARSET = utf8;
 
 CREATE TABLE result_map_entity (
-    id         BIGINT primary key,
-    column1    varchar(200) default '1',
-    column2    varchar(200) default '2',
-    column3    varchar(200) default '3',
-    column4    varchar(200) default '4',
-    list       varchar(200),
-    map        varchar(200)
+                                   id      BIGINT primary key,
+                                   column1 varchar(200) default '1',
+                                   column2 varchar(200) default '2',
+                                   column3 varchar(200) default '3',
+                                   column4 varchar(200) default '4',
+                                   list    varchar(200),
+                                   map     varchar(200),
+                                   mapp    varchar(200)
 )ENGINE = innodb
 DEFAULT CHARSET = utf8;