miemie 4 years ago
parent
commit
1e83936106

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

@@ -139,6 +139,16 @@ public @interface TableField {
      */
     Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class;
 
+    /**
+     * 只在使用了 {@link #typeHandler()} 时判断是否辅助追加 javaType
+     * <p>
+     * 一般情况下不推荐使用
+     * {@link ParameterMapping#javaType}
+     *
+     * @since 3.3.3 @2020-07-23
+     */
+    boolean javaType() default false;
+
     /**
      * 指定小数点后保留的位数,
      * 只生效与 mp 自动注入的 method,

+ 18 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableFieldInfo.java

@@ -24,12 +24,10 @@ import lombok.*;
 import org.apache.ibatis.mapping.ResultMapping;
 import org.apache.ibatis.reflection.Reflector;
 import org.apache.ibatis.session.Configuration;
-import org.apache.ibatis.type.JdbcType;
-import org.apache.ibatis.type.TypeHandler;
-import org.apache.ibatis.type.TypeHandlerRegistry;
-import org.apache.ibatis.type.UnknownTypeHandler;
+import org.apache.ibatis.type.*;
 
 import java.lang.reflect.Field;
+import java.util.Map;
 
 /**
  * 数据库表字段反射信息
@@ -185,6 +183,22 @@ public class TableFieldInfo implements Constants {
         }
         if (UnknownTypeHandler.class != typeHandler) {
             this.typeHandler = (Class<? extends TypeHandler<?>>) typeHandler;
+            if (tableField.javaType()) {
+                String javaType = null;
+                TypeAliasRegistry registry = tableInfo.getConfiguration().getTypeAliasRegistry();
+                Map<String, Class<?>> typeAliases = registry.getTypeAliases();
+                for (Map.Entry<String, Class<?>> entry : typeAliases.entrySet()) {
+                    if (entry.getValue().equals(propertyType)) {
+                        javaType = entry.getKey();
+                        break;
+                    }
+                }
+                if (javaType == null) {
+                    javaType = propertyType.getName();
+                    registry.registerAlias(javaType, propertyType);
+                }
+                el += (COMMA + "javaType=" + javaType);
+            }
             el += (COMMA + "typeHandler=" + typeHandler.getName());
         }
         if (StringUtils.isNotBlank(numericScale)) {

+ 3 - 3
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/BaseDbTest.java

@@ -63,6 +63,9 @@ public abstract class BaseDbTest<T> extends TypeReference<T> {
         Environment environment = new Environment("test", new JdbcTransactionFactory(), ds);
         MybatisConfiguration configuration = new MybatisConfiguration(environment);
         configuration.setUseDeprecatedExecutor(false);
+        if (consumer != null) {
+            consumer.accept(configuration);
+        }
         GlobalConfigUtils.setGlobalConfig(configuration, globalConfig);
         configuration.setLogImpl(Slf4jImpl.class);
         if (StringUtils.isNotBlank(mapperXml)) {
@@ -79,9 +82,6 @@ public abstract class BaseDbTest<T> extends TypeReference<T> {
         if (CollectionUtils.isNotEmpty(interceptors)) {
             interceptors.forEach(configuration::addInterceptor);
         }
-        if (consumer != null) {
-            consumer.accept(configuration);
-        }
         sqlSessionFactory = builder.build(configuration);
     }
 

+ 7 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/enums/Entity.java

@@ -1,7 +1,10 @@
 package com.baomidou.mybatisplus.test.enums;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.experimental.Accessors;
+import org.apache.ibatis.type.EnumOrdinalTypeHandler;
 
 import java.io.Serializable;
 
@@ -11,6 +14,7 @@ import java.io.Serializable;
  */
 @Data
 @Accessors(chain = true)
+@TableName(autoResultMap = true)
 public class Entity implements Serializable {
     private static final long serialVersionUID = 5094767605376915138L;
 
@@ -19,4 +23,7 @@ public class Entity implements Serializable {
     private EnumStr enumStr;
 
     private EnumInt enumInt;
+
+    @TableField(typeHandler = EnumOrdinalTypeHandler.class, javaType = true)
+    private EnumOrdinal enumOrdinal;
 }

+ 13 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/enums/EnumOrdinal.java

@@ -0,0 +1,13 @@
+package com.baomidou.mybatisplus.test.enums;
+
+import lombok.Getter;
+
+/**
+ * @author miemie
+ * @since 2020-07-21
+ */
+@Getter
+public enum EnumOrdinal {
+    ONE,
+    TWO,
+}

+ 6 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/enums/EnumTest.java

@@ -21,15 +21,19 @@ public class EnumTest extends BaseDbTest<EntityMapper> {
     void test() {
         Long id = 1L;
         doTestAutoCommit(m -> {
-            Entity entity = new Entity().setId(id).setEnumInt(EnumInt.ONE).setEnumStr(EnumStr.TWO);
+            Entity entity = new Entity().setId(id).setEnumInt(EnumInt.ONE).setEnumStr(EnumStr.TWO).setEnumOrdinal(EnumOrdinal.TWO);
             int insert = m.insert(entity);
             assertThat(insert).as("插入成功").isEqualTo(1);
         });
+
         doTest(m -> {
             Entity entity = m.selectById(id);
             assertThat(entity).as("查出刚刚插入的数据").isNotNull();
             assertThat(entity.getEnumInt()).as("枚举正确").isEqualTo(EnumInt.ONE);
             assertThat(entity.getEnumStr()).as("枚举正确").isEqualTo(EnumStr.TWO);
+            assertThat(entity.getEnumOrdinal()).as("枚举正确").isEqualTo(EnumOrdinal.TWO);
+            entity.setEnumOrdinal(EnumOrdinal.ONE);
+            m.updateById(entity);
         });
     }
 
@@ -45,6 +49,7 @@ public class EnumTest extends BaseDbTest<EntityMapper> {
                 "id BIGINT(20) NOT NULL,\n" +
                 "enum_int integer NULL DEFAULT NULL,\n" +
                 "enum_str VARCHAR(30) NULL DEFAULT NULL,\n" +
+                "enum_ordinal integer NULL DEFAULT NULL,\n" +
                 "PRIMARY KEY (id)" +
                 ")");
     }