Ver Fonte

fix: 修复SQLServer日期生成错误.

https://github.com/baomidou/generator/issues/8
lanjerry há 4 anos atrás
pai
commit
c1502bbcd5

+ 52 - 6
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/SqlServerTypeConvert.java

@@ -15,14 +15,28 @@
  */
 package com.baomidou.mybatisplus.generator.config.converts;
 
+import static com.baomidou.mybatisplus.generator.config.converts.TypeConverts.contains;
+import static com.baomidou.mybatisplus.generator.config.converts.TypeConverts.containsAny;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.BIG_DECIMAL;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.BOOLEAN;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.BYTE_ARRAY;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.DATE;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.DATE_SQL;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.DOUBLE;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.FLOAT;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.INTEGER;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.LOCAL_DATE;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.LOCAL_DATE_TIME;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.LOCAL_TIME;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.LONG;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.STRING;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.TIME;
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.TIMESTAMP;
+
 import com.baomidou.mybatisplus.generator.config.GlobalConfig;
 import com.baomidou.mybatisplus.generator.config.ITypeConvert;
 import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
 
-import static com.baomidou.mybatisplus.generator.config.converts.TypeConverts.contains;
-import static com.baomidou.mybatisplus.generator.config.converts.TypeConverts.containsAny;
-import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.*;
-
 /**
  * SQLServer 字段类型转换
  *
@@ -30,18 +44,19 @@ import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.*;
  * @since 2017-01-20
  */
 public class SqlServerTypeConvert implements ITypeConvert {
+
     public static final SqlServerTypeConvert INSTANCE = new SqlServerTypeConvert();
 
     /**
      * @inheritDoc
      */
     @Override
-    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
+    public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
         return TypeConverts.use(fieldType)
             .test(containsAny("char", "xml", "text").then(STRING))
             .test(contains("bigint").then(LONG))
             .test(contains("int").then(INTEGER))
-            .test(containsAny("date", "time").then(STRING))
+            .test(containsAny("date", "time").then(t -> toDateType(config, t)))
             .test(contains("bit").then(BOOLEAN))
             .test(containsAny("decimal", "numeric").then(DOUBLE))
             .test(contains("money").then(BIG_DECIMAL))
@@ -50,4 +65,35 @@ public class SqlServerTypeConvert implements ITypeConvert {
             .or(STRING);
     }
 
+    /**
+     * 转换为日期类型
+     *
+     * @param config 配置信息
+     * @param type   类型
+     * @return 返回对应的列类型
+     */
+    public static IColumnType toDateType(GlobalConfig config, String type) {
+        switch (config.getDateType()) {
+            case SQL_PACK:
+                switch (type) {
+                    case "date":
+                        return DATE_SQL;
+                    case "time":
+                        return TIME;
+                    default:
+                        return TIMESTAMP;
+                }
+            case TIME_PACK:
+                switch (type) {
+                    case "date":
+                        return LOCAL_DATE;
+                    case "time":
+                        return LOCAL_TIME;
+                    default:
+                        return LOCAL_DATE_TIME;
+                }
+            default:
+                return DATE;
+        }
+    }
 }

+ 54 - 0
mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/generator/config/converts/SqlServerTypeConvertTest.java

@@ -0,0 +1,54 @@
+package com.baomidou.mybatisplus.generator.config.converts;
+
+import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.*;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+
+/**
+ * @author lanjerry 2020/10/23.
+ */
+public class SqlServerTypeConvertTest {
+
+    @Test
+    void processTypeConvertTest() {
+        // 常用格式
+        GlobalConfig globalConfig = new GlobalConfig();
+        SqlServerTypeConvert convert = SqlServerTypeConvert.INSTANCE;
+        Assertions.assertEquals(STRING, convert.processTypeConvert(globalConfig, "char"));
+        Assertions.assertEquals(STRING, convert.processTypeConvert(globalConfig, "xml"));
+        Assertions.assertEquals(STRING, convert.processTypeConvert(globalConfig, "text"));
+        Assertions.assertEquals(LONG, convert.processTypeConvert(globalConfig, "bigint"));
+        Assertions.assertEquals(INTEGER, convert.processTypeConvert(globalConfig, "int"));
+        Assertions.assertEquals(BOOLEAN, convert.processTypeConvert(globalConfig, "bit"));
+        Assertions.assertEquals(DOUBLE, convert.processTypeConvert(globalConfig, "decimal"));
+        Assertions.assertEquals(DOUBLE, convert.processTypeConvert(globalConfig, "numeric"));
+        Assertions.assertEquals(BIG_DECIMAL, convert.processTypeConvert(globalConfig, "money"));
+        Assertions.assertEquals(BYTE_ARRAY, convert.processTypeConvert(globalConfig, "binary"));
+        Assertions.assertEquals(BYTE_ARRAY, convert.processTypeConvert(globalConfig, "image"));
+        Assertions.assertEquals(FLOAT, convert.processTypeConvert(globalConfig, "float"));
+        Assertions.assertEquals(FLOAT, convert.processTypeConvert(globalConfig, "real"));
+
+        // 日期格式
+        globalConfig = new GlobalConfig().setDateType(DateType.SQL_PACK);
+        Assertions.assertEquals(DATE_SQL, convert.processTypeConvert(globalConfig, "date"));
+        Assertions.assertEquals(TIME, convert.processTypeConvert(globalConfig, "time"));
+        Assertions.assertEquals(TIMESTAMP, convert.processTypeConvert(globalConfig, "timestamp"));
+        Assertions.assertEquals(TIMESTAMP, convert.processTypeConvert(globalConfig, "datetime"));
+
+        globalConfig = new GlobalConfig().setDateType(DateType.TIME_PACK);
+        Assertions.assertEquals(LOCAL_DATE, convert.processTypeConvert(globalConfig, "date"));
+        Assertions.assertEquals(LOCAL_TIME, convert.processTypeConvert(globalConfig, "time"));
+        Assertions.assertEquals(LOCAL_DATE_TIME, convert.processTypeConvert(globalConfig, "timestamp"));
+        Assertions.assertEquals(LOCAL_DATE_TIME, convert.processTypeConvert(globalConfig, "datetime"));
+
+        globalConfig = new GlobalConfig().setDateType(DateType.ONLY_DATE);
+        Assertions.assertEquals(DATE, convert.processTypeConvert(globalConfig, "date"));
+        Assertions.assertEquals(DATE, convert.processTypeConvert(globalConfig, "time"));
+        Assertions.assertEquals(DATE, convert.processTypeConvert(globalConfig, "timestamp"));
+        Assertions.assertEquals(DATE, convert.processTypeConvert(globalConfig, "datetime"));
+    }
+}