Przeglądaj źródła

fix(mybatis-plus-generator.main): 重构生成器数据库类型转换器,修复部分支条件

825944942@qq.com 5 lat temu
rodzic
commit
b26bbfa777
21 zmienionych plików z 578 dodań i 656 usunięć
  1. 5 5
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisConfiguration.java
  2. 8 4
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/DataSourceConfig.java
  3. 2 3
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/ITypeConvert.java
  4. 25 35
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/DB2TypeConvert.java
  5. 39 103
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/DmTypeConvert.java
  6. 0 131
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/GaussTypeConvert.java
  7. 53 51
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/KingbaseESTypeConvert.java
  8. 59 56
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/MySqlTypeConvert.java
  9. 63 32
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/OracleTypeConvert.java
  10. 54 54
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/PostgreSqlTypeConvert.java
  11. 20 47
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/SqlServerTypeConvert.java
  12. 27 49
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/SqliteTypeConvert.java
  13. 0 49
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/TypeConvertRegistry.java
  14. 90 0
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/TypeConverts.java
  15. 0 3
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/package-info.java
  16. 30 0
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/select/Branch.java
  17. 24 0
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/select/BranchBuilder.java
  18. 58 0
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/select/Selector.java
  19. 8 12
      mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/test/generator/KingbaseESGenerator.java
  20. 5 10
      mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/test/generator/MysqlGenerator.java
  21. 8 12
      mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/test/generator/PostgreSQLGenerator.java

+ 5 - 5
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisConfiguration.java

@@ -69,17 +69,17 @@ public class MybatisConfiguration extends Configuration {
 
     /**
      * MybatisPlus 加载 SQL 顺序:
-     * <p>1、加载XML中的SQL</p>
-     * <p>2、加载sqlProvider中的SQL</p>
-     * <p>3、xmlSql 与 sqlProvider不能包含相同的SQL</p>
-     * <p>调整后的SQL优先级:xmlSql > sqlProvider > curdSql</p>
+     * <p> 1、加载 XML中的 SQL </p>
+     * <p> 2、加载 SqlProvider 中的 SQL </p>
+     * <p> 3、XmlSql 与 SqlProvider不能包含相同的 SQL </p>
+     * <p>调整后的 SQL优先级:XmlSql > sqlProvider > CurdSql </p>
      */
     @Override
     public void addMappedStatement(MappedStatement ms) {
         logger.debug("addMappedStatement: " + ms.getId());
         if (mappedStatements.containsKey(ms.getId())) {
             /*
-             * 说明已加载了xml中的节点; 忽略mapper中的SqlProvider数据
+             * 说明已加载了xml中的节点; 忽略mapper中的 SqlProvider 数据
              */
             logger.error("mapper[" + ms.getId() + "] is ignored, because it exists, maybe from xml file");
             return;

+ 8 - 4
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/DataSourceConfig.java

@@ -17,7 +17,8 @@ package com.baomidou.mybatisplus.generator.config;
 
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
-import com.baomidou.mybatisplus.generator.config.converts.TypeConvertRegistry;
+import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
+import com.baomidou.mybatisplus.generator.config.converts.TypeConverts;
 import com.baomidou.mybatisplus.generator.config.querys.DbQueryRegistry;
 import lombok.Data;
 import lombok.experimental.Accessors;
@@ -55,6 +56,7 @@ public class DataSourceConfig {
     private ITypeConvert typeConvert;
     /**
      * 关键字处理器
+     *
      * @since 3.3.2
      */
     private IKeyWordsHandler keyWordsHandler;
@@ -81,7 +83,7 @@ public class DataSourceConfig {
             DbQueryRegistry dbQueryRegistry = new DbQueryRegistry();
             // 默认 MYSQL
             dbQuery = Optional.ofNullable(dbQueryRegistry.getDbQuery(dbType))
-                    .orElseGet(() -> dbQueryRegistry.getDbQuery(DbType.MYSQL));
+                .orElseGet(() -> dbQueryRegistry.getDbQuery(DbType.MYSQL));
         }
         return dbQuery;
     }
@@ -142,9 +144,11 @@ public class DataSourceConfig {
     public ITypeConvert getTypeConvert() {
         if (null == typeConvert) {
             DbType dbType = getDbType();
-            TypeConvertRegistry typeConvertRegistry = new TypeConvertRegistry();
             // 默认 MYSQL
-            typeConvert = Optional.ofNullable(typeConvertRegistry.getTypeConvert(dbType)).orElseGet(() -> typeConvertRegistry.getTypeConvert(DbType.MYSQL));
+            typeConvert = TypeConverts.getTypeConvert(dbType);
+            if (null == typeConvert) {
+                typeConvert = MySqlTypeConvert.INSTANCE;
+            }
         }
         return typeConvert;
     }

+ 2 - 3
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/ITypeConvert.java

@@ -22,11 +22,11 @@ import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
  * 数据库字段类型转换
  *
  * @author hubin
+ * @author hanchunlin
  * @since 2017-01-20
  */
 public interface ITypeConvert {
 
-
     /**
      * 执行类型转换
      *
@@ -35,11 +35,9 @@ public interface ITypeConvert {
      * @return ignore
      */
     default IColumnType processTypeConvert(GlobalConfig globalConfig, TableField tableField) {
-        // 该方法提供重写
         return processTypeConvert(globalConfig, tableField.getType());
     }
 
-
     /**
      * 执行类型转换
      *
@@ -48,4 +46,5 @@ public interface ITypeConvert {
      * @return ignore
      */
     IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType);
+
 }

+ 25 - 35
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/DB2TypeConvert.java

@@ -17,51 +17,41 @@ package com.baomidou.mybatisplus.generator.config.converts;
 
 import com.baomidou.mybatisplus.generator.config.GlobalConfig;
 import com.baomidou.mybatisplus.generator.config.ITypeConvert;
-import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
 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.*;
+
 /**
  * DB2 字段类型转换
  *
  * @author zhanyao
+ * @author hanchunlin
  * @since 2018-05-16
  */
-public class  DB2TypeConvert implements ITypeConvert {
+public class DB2TypeConvert implements ITypeConvert {
+    public static final DB2TypeConvert INSTANCE = new DB2TypeConvert();
 
+    /**
+     * @inheritDoc
+     */
     @Override
-    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
-        String t = fieldType.toLowerCase();
-        if (t.contains("char")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("bigint")) {
-            return DbColumnType.LONG;
-        } else if (t.contains("smallint")) {
-            return DbColumnType.BASE_SHORT;
-        } else if (t.contains("int")) {
-            return DbColumnType.INTEGER;
-        } else if (t.contains("date") || t.contains("time")
-            || t.contains("year") || t.contains("timestamp")) {
-            return DbColumnType.DATE;
-        } else if (t.contains("text")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("bit")) {
-            return DbColumnType.BOOLEAN;
-        } else if (t.contains("decimal")) {
-            return DbColumnType.BIG_DECIMAL;
-        } else if (t.contains("clob")) {
-            return DbColumnType.CLOB;
-        } else if (t.contains("blob")) {
-            return DbColumnType.BLOB;
-        } else if (t.contains("binary")) {
-            return DbColumnType.BYTE_ARRAY;
-        } else if (t.contains("float")) {
-            return DbColumnType.FLOAT;
-        } else if (t.contains("double")) {
-            return DbColumnType.DOUBLE;
-        } else if (t.contains("json") || t.contains("enum")) {
-            return DbColumnType.STRING;
-        }
-        return DbColumnType.STRING;
+    public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
+        return TypeConverts.use(fieldType)
+            .test(containsAny("char", "text", "json", "enum").then(STRING))
+            .test(contains("bigint").then(LONG))
+            .test(contains("smallint").then(BASE_SHORT))
+            .test(contains("int").then(INTEGER))
+            .test(containsAny("date", "time", "year").then(DATE))
+            .test(contains("bit").then(BOOLEAN))
+            .test(contains("decimal").then(BIG_DECIMAL))
+            .test(contains("clob").then(CLOB))
+            .test(contains("blob").then(BLOB))
+            .test(contains("binary").then(BYTE_ARRAY))
+            .test(contains("float").then(FLOAT))
+            .test(contains("double").then(DOUBLE))
+            .or(STRING);
     }
 
 }

+ 39 - 103
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/DmTypeConvert.java

@@ -17,121 +17,57 @@ package com.baomidou.mybatisplus.generator.config.converts;
 
 import com.baomidou.mybatisplus.generator.config.GlobalConfig;
 import com.baomidou.mybatisplus.generator.config.ITypeConvert;
-import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
 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.*;
+
 /**
  * DM 字段类型转换
  *
  * @author halower
+ * @author hanchunlin
  * @since 2019-06-27
  */
 public class DmTypeConvert implements ITypeConvert {
-
-    @Override
-    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
-        String t = fieldType.toLowerCase();
-        return new BasicDataTypeHandler().getDbColumnType(t);
-    }
-
-     interface Handler {
-         DbColumnType getDbColumnType(String fieldType);
-    }
-
-    /**
-     * 常规数据类型
-     */
-    class BasicDataTypeHandler implements Handler {
-        @Override
-        public DbColumnType getDbColumnType(String fieldType) {
-            //字符数据类型: CHAR,CHARACTER,VARCHAR
-            if(fieldType.contains("char")) {
-                return DbColumnType.STRING;
-            }
-            /**
-             *  数值数据类型:
-             *  NUMERIC,DECIMAL,DEC,MONEY,BIT,BOOL,BOOLEAN,INTEGER,INT,BIGINT
-             *  TINYINT,BYTE,SMALLINT,BINARY,VARBINARY
-             */
-            else if (fieldType.contains("numeric")
-                || fieldType.contains("decimal")
-                || fieldType.contains("dec")
-                || fieldType.contains("money")) {
-                return DbColumnType.BIG_DECIMAL;
-            }
-            else if(fieldType.contains("bit")
-                || fieldType.contains("bool")
-                || fieldType.contains("boolean")){
-                return DbColumnType.BOOLEAN;
-            }
-            else if(fieldType.contains("integer") || fieldType.contains("int")){
-                return DbColumnType.INTEGER;
-            }
-            else if(fieldType.contains("bigint") ){
-                return DbColumnType.BIG_INTEGER;
-            }
-            else if(fieldType.contains("tinyint")
-                || fieldType.contains("byte")
-                || fieldType.contains("smallint")
-                ){
-                return DbColumnType.INTEGER;
-            }
-            else if (fieldType.contains("binary")
-                || fieldType.contains("varbinary")
-                ) {
-                return DbColumnType.BYTE_ARRAY;
-            }
-            /**
-             * 近似数值数据类型:
-             * FLOAT
-             */
-            else if (fieldType.contains("float")) {
-                return DbColumnType.FLOAT;
-            }
-            /**
-             * DOUBLE, DOUBLE PRECISION,REAL
-             */
-            else if (fieldType.contains("double") || fieldType.contains("real")) {
-                return DbColumnType.DOUBLE;
-            }
-           return new DateTimeDataTypeHandler().getDbColumnType(fieldType);
-        }
-    }
+    public static final DmTypeConvert INSTANCE = new DmTypeConvert();
 
     /**
-     *  日期时间数据类型
+     * 字符数据类型: CHAR,CHARACTER,VARCHAR
+     * <p>
+     * 数值数据类型: NUMERIC,DECIMAL,DEC,MONEY,BIT,BOOL,BOOLEAN,INTEGER,INT,BIGINT,TINYINT,BYTE,SMALLINT,BINARY,
+     * VARBINARY
+     * <p>
+     * 近似数值数据类型: FLOAT
+     * <p>
+     * DOUBLE, DOUBLE PRECISION,REAL
+     * <p>
+     * 日期时间数据类型
+     * <p>
+     * 多媒体数据类型: TEXT,LONGVARCHAR,CLOB,BLOB,IMAGE
+     *
+     * @param config    全局配置
+     * @param fieldType 字段类型
+     * @return 对应的数据类型
+     * @inheritDoc
      */
-    class DateTimeDataTypeHandler implements Handler{
-
-        @Override
-        public DbColumnType getDbColumnType(String fieldType) {
-           if (fieldType.contains("date")
-               || fieldType.contains("time")
-               || fieldType.contains("timestamp")) {
-                return DbColumnType.DATE;
-            }
-            return new MultimediaDataTypeHandler().getDbColumnType(fieldType);
-        }
+    @Override
+    public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
+        return TypeConverts.use(fieldType)
+            .test(containsAny("char", "text").then(STRING))
+            .test(containsAny("numeric", "dec", "money").then(BIG_DECIMAL))
+            .test(containsAny("bit", "bool").then(BOOLEAN))
+            .test(contains("bigint").then(BIG_INTEGER))
+            .test(containsAny("int", "byte").then(INTEGER))
+            .test(contains("binary").then(BYTE_ARRAY))
+            .test(contains("float").then(FLOAT))
+            .test(containsAny("double", "real").then(DOUBLE))
+            .test(containsAny("date", "time").then(DATE))
+            .test(contains("clob").then(CLOB))
+            .test(contains("blob").then(BLOB))
+            .test(contains("image").then(BYTE_ARRAY))
+            .or(STRING);
     }
 
-    /**
-     *  多媒体数据类型
-     *  TEXT,LONGVARCHAR,CLOB,BLOB,IMAGE
-     */
-
-    class MultimediaDataTypeHandler implements Handler{
-        @Override
-        public DbColumnType getDbColumnType(String fieldType) {
-            if (fieldType.contains("text")|| fieldType.contains("longvarchar")) {
-                return DbColumnType.STRING;
-            } else if (fieldType.contains("clob")) {
-                return DbColumnType.CLOB;
-            } else if (fieldType.contains("blob")) {
-                return DbColumnType.BLOB;
-            } else if (fieldType.contains("image")) {
-                return DbColumnType.BYTE_ARRAY;
-            }
-            return DbColumnType.STRING;
-        }
-    }
 }

+ 0 - 131
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/GaussTypeConvert.java

@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 2011-2020, baomidou (jobob@qq.com).
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.baomidou.mybatisplus.generator.config.converts;
-
-import com.baomidou.mybatisplus.generator.config.GlobalConfig;
-import com.baomidou.mybatisplus.generator.config.ITypeConvert;
-import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
-import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
-
-/**
- * GAUSS 字段类型转换
- *
- * @author halower
- * @since 2019-06-27
- */
-public class GaussTypeConvert implements ITypeConvert {
-
-    @Override
-    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
-        String t = fieldType.toLowerCase();
-        return new BasicDataTypeHandler().getDbColumnType(t);
-    }
-
-    interface Handler {
-        DbColumnType getDbColumnType(String fieldType);
-    }
-
-    /**
-     * 常规数据类型
-     */
-    class BasicDataTypeHandler implements Handler {
-        @Override
-        public DbColumnType getDbColumnType(String fieldType) {
-            //字符数据类型: CHAR,CHARACTER,VARCHAR
-            if (fieldType.contains("char")) {
-                return DbColumnType.STRING;
-            }
-            /**
-             *  数值数据类型:
-             *  NUMERIC,DECIMAL,DEC,MONEY,BIT,BOOL,BOOLEAN,INTEGER,INT,BIGINT
-             *  TINYINT,BYTE,SMALLINT,BINARY,VARBINARY
-             */
-            else if (fieldType.contains("numeric")
-                || fieldType.contains("decimal")
-                || fieldType.contains("dec")
-                || fieldType.contains("money")) {
-                return DbColumnType.BIG_DECIMAL;
-            } else if (fieldType.contains("bit")
-                || fieldType.contains("bool")
-                || fieldType.contains("boolean")) {
-                return DbColumnType.BOOLEAN;
-            } else if (fieldType.contains("integer") || fieldType.contains("int")) {
-                return DbColumnType.INTEGER;
-            } else if (fieldType.contains("bigint")) {
-                return DbColumnType.BIG_INTEGER;
-            } else if (fieldType.contains("tinyint")
-                || fieldType.contains("byte")
-                || fieldType.contains("smallint")
-            ) {
-                return DbColumnType.INTEGER;
-            } else if (fieldType.contains("binary")
-                || fieldType.contains("varbinary")
-            ) {
-                return DbColumnType.BYTE_ARRAY;
-            }
-            /**
-             * 近似数值数据类型:
-             * FLOAT
-             */
-            else if (fieldType.contains("float")) {
-                return DbColumnType.FLOAT;
-            }
-            /**
-             * DOUBLE, DOUBLE PRECISION,REAL
-             */
-            else if (fieldType.contains("double") || fieldType.contains("real")) {
-                return DbColumnType.DOUBLE;
-            }
-            return new DateTimeDataTypeHandler().getDbColumnType(fieldType);
-        }
-    }
-
-    /**
-     * 日期时间数据类型
-     */
-    class DateTimeDataTypeHandler implements Handler {
-
-        @Override
-        public DbColumnType getDbColumnType(String fieldType) {
-            if (fieldType.contains("date")
-                || fieldType.contains("time")
-                || fieldType.contains("timestamp")) {
-                return DbColumnType.DATE;
-            }
-            return new MultimediaDataTypeHandler().getDbColumnType(fieldType);
-        }
-    }
-
-    /**
-     * 多媒体数据类型
-     * TEXT,LONGVARCHAR,CLOB,BLOB,IMAGE
-     */
-    class MultimediaDataTypeHandler implements Handler {
-        @Override
-        public DbColumnType getDbColumnType(String fieldType) {
-            if (fieldType.contains("text") || fieldType.contains("longvarchar")) {
-                return DbColumnType.STRING;
-            } else if (fieldType.contains("clob")) {
-                return DbColumnType.CLOB;
-            } else if (fieldType.contains("blob")) {
-                return DbColumnType.BLOB;
-            } else if (fieldType.contains("image")) {
-                return DbColumnType.BYTE_ARRAY;
-            }
-            return DbColumnType.STRING;
-        }
-    }
-}

+ 53 - 51
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/KingbaseESTypeConvert.java

@@ -17,72 +17,74 @@ package com.baomidou.mybatisplus.generator.config.converts;
 
 import com.baomidou.mybatisplus.generator.config.GlobalConfig;
 import com.baomidou.mybatisplus.generator.config.ITypeConvert;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
 import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
 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.*;
+
 /**
  * KingbaseES 字段类型转换
  *
  * @author kingbase
+ * @author hanchunlin
  * @since 2019-10-12
  */
 public class KingbaseESTypeConvert implements ITypeConvert {
+    public static final KingbaseESTypeConvert INSTANCE = new KingbaseESTypeConvert();
 
+    /**
+     * @param globalConfig 全局配置
+     * @param fieldType    字段类型
+     * @return 返回对应的字段类型
+     */
     @Override
     public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
-        String t = fieldType.toLowerCase();
-        if (t.contains("char")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("bigint")) {
-            return DbColumnType.LONG;
-        } else if (t.contains("int")) {
-            return DbColumnType.INTEGER;
-        } else if (t.contains("date") || t.contains("time")) {
-            switch (globalConfig.getDateType()) {
-                case ONLY_DATE:
-                    return DbColumnType.DATE;
-                case SQL_PACK:
-                    switch (t) {
-                        case "date":
-                            return DbColumnType.DATE_SQL;
-                        case "time":
-                            return DbColumnType.TIME;
-                        default:
-                            return DbColumnType.TIMESTAMP;
-                    }
-                case TIME_PACK:
-                    switch (t) {
-                        case "date":
-                            return DbColumnType.LOCAL_DATE;
-                        case "time":
-                            return DbColumnType.LOCAL_TIME;
-                        default:
-                            return DbColumnType.LOCAL_DATE_TIME;
-                    }
+        return TypeConverts.use(fieldType)
+            .test(containsAny("char", "text", "json", "enum").then(STRING))
+            .test(contains("bigint").then(LONG))
+            .test(contains("int").then(INTEGER))
+            .test(containsAny("date", "time").then(p -> toDateType(globalConfig, p)))
+            .test(containsAny("bit", "boolean").then(BOOLEAN))
+            .test(containsAny("decimal", "numeric").then(BIG_DECIMAL))
+            .test(contains("clob").then(CLOB))
+            .test(contains("blob").then(BYTE_ARRAY))
+            .test(contains("float").then(FLOAT))
+            .test(contains("double").then(DOUBLE))
+            .or(STRING);
+    }
+
+    /**
+     * 转换为日期类型
+     *
+     * @param config 配置信息
+     * @param type   类型
+     * @return 返回对应的列类型
+     */
+    private IColumnType toDateType(GlobalConfig config, String type) {
+        DateType dateType = config.getDateType();
+        if (dateType == DateType.SQL_PACK) {
+            switch (type) {
+                case "date":
+                    return DATE_SQL;
+                case "time":
+                    return TIME;
                 default:
-                    return DbColumnType.DATE;
+                    return TIMESTAMP;
+            }
+        } else if (dateType == DateType.TIME_PACK) {
+            switch (type) {
+                case "date":
+                    return LOCAL_DATE;
+                case "time":
+                    return LOCAL_TIME;
+                default:
+                    return LOCAL_DATE_TIME;
             }
-        } else if (t.contains("text")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("bit")) {
-            return DbColumnType.BOOLEAN;
-        } else if (t.contains("decimal")) {
-            return DbColumnType.BIG_DECIMAL;
-        } else if (t.contains("clob")) {
-            return DbColumnType.CLOB;
-        } else if (t.contains("blob")) {
-            return DbColumnType.BYTE_ARRAY;
-        } else if (t.contains("float")) {
-            return DbColumnType.FLOAT;
-        } else if (t.contains("double")) {
-            return DbColumnType.DOUBLE;
-        } else if (t.contains("json") || t.contains("enum")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("boolean")) {
-            return DbColumnType.BOOLEAN;
-        } else if (t.contains("numeric")) {
-            return DbColumnType.BIG_DECIMAL;
         }
-        return DbColumnType.STRING;
+        return DbColumnType.DATE;
     }
+
 }

+ 59 - 56
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/MySqlTypeConvert.java

@@ -20,71 +20,74 @@ import com.baomidou.mybatisplus.generator.config.ITypeConvert;
 import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
 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.*;
+
 /**
  * MYSQL 数据库字段类型转换
  *
  * @author hubin
+ * @author hanchunlin
  * @since 2017-01-20
  */
 public class MySqlTypeConvert implements ITypeConvert {
+    public static final MySqlTypeConvert INSTANCE = new MySqlTypeConvert();
 
+    /**
+     * @inheritDoc
+     */
     @Override
-    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
-        String t = fieldType.toLowerCase();
-        if (t.contains("char")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("bigint")) {
-            return DbColumnType.LONG;
-        } else if (t.contains("tinyint(1)")) {
-            return DbColumnType.BOOLEAN;
-        } else if (t.contains("int")) {
-            return DbColumnType.INTEGER;
-        } else if (t.contains("text")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("bit")) {
-            return DbColumnType.BOOLEAN;
-        } else if (t.contains("decimal")) {
-            return DbColumnType.BIG_DECIMAL;
-        } else if (t.contains("clob")) {
-            return DbColumnType.CLOB;
-        } else if (t.contains("blob")) {
-            return DbColumnType.BLOB;
-        } else if (t.contains("binary")) {
-            return DbColumnType.BYTE_ARRAY;
-        } else if (t.contains("float")) {
-            return DbColumnType.FLOAT;
-        } else if (t.contains("double")) {
-            return DbColumnType.DOUBLE;
-        } else if (t.contains("json") || t.contains("enum")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("date") || t.contains("time") || t.contains("year")) {
-            switch (globalConfig.getDateType()) {
-                case ONLY_DATE:
-                    return DbColumnType.DATE;
-                case SQL_PACK:
-                    switch (t) {
-                        case "date":
-                            return DbColumnType.DATE_SQL;
-                        case "time":
-                            return DbColumnType.TIME;
-                        case "year":
-                            return DbColumnType.DATE_SQL;
-                        default:
-                            return DbColumnType.TIMESTAMP;
-                    }
-                case TIME_PACK:
-                    switch (t) {
-                        case "date":
-                            return DbColumnType.LOCAL_DATE;
-                        case "time":
-                            return DbColumnType.LOCAL_TIME;
-                        case "year":
-                            return DbColumnType.YEAR;
-                        default:
-                            return DbColumnType.LOCAL_DATE_TIME;
-                    }
-            }
+    public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
+        return TypeConverts.use(fieldType)
+            .test(containsAny("char", "text", "json", "enum").then(STRING))
+            .test(contains("bigint").then(LONG))
+            .test(containsAny("tinyint(1)", "bit").then(BOOLEAN))
+            .test(contains("int").then(INTEGER))
+            .test(contains("decimal").then(BIG_DECIMAL))
+            .test(contains("clob").then(CLOB))
+            .test(contains("blob").then(BLOB))
+            .test(contains("binary").then(BYTE_ARRAY))
+            .test(contains("float").then(FLOAT))
+            .test(contains("double").then(DOUBLE))
+            .test(containsAny("date", "time", "year").then(t -> toDateType(config, t)))
+            .or(STRING);
+    }
+
+    /**
+     * 转换为日期类型
+     *
+     * @param config 配置信息
+     * @param type   类型
+     * @return 返回对应的列类型
+     */
+    public static IColumnType toDateType(GlobalConfig config, String type) {
+        switch (config.getDateType()) {
+            case ONLY_DATE:
+                return DbColumnType.DATE;
+            case SQL_PACK:
+                switch (type) {
+                    case "date":
+                    case "year":
+                        return DbColumnType.DATE_SQL;
+                    case "time":
+                        return DbColumnType.TIME;
+                    default:
+                        return DbColumnType.TIMESTAMP;
+                }
+            case TIME_PACK:
+                switch (type) {
+                    case "date":
+                        return DbColumnType.LOCAL_DATE;
+                    case "time":
+                        return DbColumnType.LOCAL_TIME;
+                    case "year":
+                        return DbColumnType.YEAR;
+                    default:
+                        return DbColumnType.LOCAL_DATE_TIME;
+                }
         }
-        return DbColumnType.STRING;
+        return STRING;
     }
+
 }

+ 63 - 32
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/OracleTypeConvert.java

@@ -20,47 +20,78 @@ import com.baomidou.mybatisplus.generator.config.ITypeConvert;
 import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
 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.*;
+
 /**
- * ORACLE 字段类型转换
+ * Oracle 数据库生成对应实体类时字段类型转换,跟据 Oracle 中的数据类型,返回对应的 Java 类型
  *
  * @author hubin
+ * @author hanchunlin
  * @since 2017-01-20
  */
 public class OracleTypeConvert implements ITypeConvert {
+    public static final OracleTypeConvert INSTANCE = new OracleTypeConvert();
 
+    /**
+     * 处理类型转换
+     *
+     * @param config    全局配置
+     * @param fieldType 字段类型
+     * @return 返回的对应的列类型
+     */
     @Override
-    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
-        String t = fieldType.toLowerCase();
-        if (t.contains("char")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("date") || t.contains("timestamp")) {
-            switch (globalConfig.getDateType()) {
-                case ONLY_DATE:
-                    return DbColumnType.DATE;
-                case SQL_PACK:
-                    return DbColumnType.TIMESTAMP;
-                case TIME_PACK:
-                    return DbColumnType.LOCAL_DATE_TIME;
-            }
-        } else if (t.contains("number")) {
-            if (t.matches("number\\(+\\d\\)")) {
-                return DbColumnType.INTEGER;
-            } else if (t.matches("number\\(+\\d{2}+\\)")) {
-                return DbColumnType.LONG;
-            }
-            return DbColumnType.BIG_DECIMAL;
-        } else if (t.contains("float")) {
-            return DbColumnType.FLOAT;
-        } else if (t.contains("clob")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("blob")) {
-            return DbColumnType.BLOB;
-        } else if (t.contains("binary")) {
-            return DbColumnType.BYTE_ARRAY;
-        } else if (t.contains("raw")) {
-            return DbColumnType.BYTE_ARRAY;
+    public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
+        return TypeConverts.use(fieldType)
+            .test(containsAny("char", "clob").then(STRING))
+            .test(containsAny("date", "timestamp").then(p -> toDateType(config)))
+            .test(contains("number").then(OracleTypeConvert::toNumberType))
+            .test(contains("float").then(FLOAT))
+            .test(contains("blob").then(BLOB))
+            .test(containsAny("binary", "raw").then(BYTE_ARRAY))
+            .or(STRING);
+    }
+
+    /**
+     * 将对应的类型名称转换为对应的 java 类类型
+     * <p>
+     * String.valueOf(Integer.MAX_VALUE).length() == 10
+     * Integer 不一定能装下 10 位的数字
+     * <p>
+     * String.valueOf(Long.MAX_VALUE).length() == 19
+     * Long 不一定能装下 19 位的数字
+     *
+     * @param typeName 类型名称
+     * @return 返回列类型
+     */
+    private static IColumnType toNumberType(String typeName) {
+        if (typeName.matches("number\\([0-9]\\)")) {
+            return DbColumnType.INTEGER;
+        } else if (typeName.matches("number\\(1[0-8]\\)")) {
+            return DbColumnType.LONG;
+        }
+        return DbColumnType.BIG_DECIMAL;
+    }
+
+    /**
+     * 当前时间为字段类型,根据全局配置返回对应的时间类型
+     *
+     * @param config 全局配置
+     * @return 时间类型
+     * @see GlobalConfig#getDateType()
+     */
+    protected static IColumnType toDateType(GlobalConfig config) {
+        switch (config.getDateType()) {
+            case ONLY_DATE:
+                return DbColumnType.DATE;
+            case SQL_PACK:
+                return DbColumnType.TIMESTAMP;
+            case TIME_PACK:
+                return DbColumnType.LOCAL_DATE_TIME;
+            default:
+                return STRING;
         }
-        return DbColumnType.STRING;
     }
 
 }

+ 54 - 54
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/PostgreSqlTypeConvert.java

@@ -20,69 +20,69 @@ import com.baomidou.mybatisplus.generator.config.ITypeConvert;
 import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
 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.*;
+
 /**
  * PostgreSQL 字段类型转换
  *
  * @author hubin
+ * @author hanchunlin
  * @since 2017-01-20
  */
 public class PostgreSqlTypeConvert implements ITypeConvert {
+    public static final PostgreSqlTypeConvert INSTANCE = new PostgreSqlTypeConvert();
 
+    /**
+     * @inheritDoc
+     */
     @Override
-    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
-        String t = fieldType.toLowerCase();
-        if (t.contains("char")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("bigint")) {
-            return DbColumnType.LONG;
-        } else if (t.contains("int")) {
-            return DbColumnType.INTEGER;
-        } else if (t.contains("date") || t.contains("time")) {
-            switch (globalConfig.getDateType()) {
-                case ONLY_DATE:
-                    return DbColumnType.DATE;
-                case SQL_PACK:
-                    switch (t) {
-                        case "date":
-                            return DbColumnType.DATE_SQL;
-                        case "time":
-                            return DbColumnType.TIME;
-                        default:
-                            return DbColumnType.TIMESTAMP;
-                    }
-                case TIME_PACK:
-                    switch (t) {
-                        case "date":
-                            return DbColumnType.LOCAL_DATE;
-                        case "time":
-                            return DbColumnType.LOCAL_TIME;
-                        default:
-                            return DbColumnType.LOCAL_DATE_TIME;
-                    }
-                default:
-                    return DbColumnType.DATE;
-            }
-        } else if (t.contains("text")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("bit")) {
-            return DbColumnType.BOOLEAN;
-        } else if (t.contains("decimal")) {
-            return DbColumnType.BIG_DECIMAL;
-        } else if (t.contains("clob")) {
-            return DbColumnType.CLOB;
-        } else if (t.contains("blob")) {
-            return DbColumnType.BYTE_ARRAY;
-        } else if (t.contains("float")) {
-            return DbColumnType.FLOAT;
-        } else if (t.contains("double")) {
-            return DbColumnType.DOUBLE;
-        } else if (t.contains("json") || t.contains("enum")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("boolean")) {
-            return DbColumnType.BOOLEAN;
-        } else if (t.contains("numeric")) {
-            return DbColumnType.BIG_DECIMAL;
+    public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
+        return TypeConverts.use(fieldType)
+            .test(containsAny("char", "text", "json", "enum").then(STRING))
+            .test(contains("bigint").then(LONG))
+            .test(contains("int").then(INTEGER))
+            .test(containsAny("date", "time").then(t -> toDateType(config, t)))
+            .test(contains("bit").then(BOOLEAN))
+            .test(containsAny("decimal", "numeric").then(BIG_DECIMAL))
+            .test(contains("clob").then(CLOB))
+            .test(contains("blob").then(BYTE_ARRAY))
+            .test(contains("float").then(FLOAT))
+            .test(contains("double").then(DOUBLE))
+            .test(contains("boolean").then(BOOLEAN))
+            .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 DbColumnType.DATE_SQL;
+                    case "time":
+                        return DbColumnType.TIME;
+                    default:
+                        return DbColumnType.TIMESTAMP;
+                }
+            case TIME_PACK:
+                switch (type) {
+                    case "date":
+                        return DbColumnType.LOCAL_DATE;
+                    case "time":
+                        return DbColumnType.LOCAL_TIME;
+                    default:
+                        return DbColumnType.LOCAL_DATE_TIME;
+                }
+            default:
+                return DbColumnType.DATE;
         }
-        return DbColumnType.STRING;
     }
 }

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

@@ -17,65 +17,38 @@ package com.baomidou.mybatisplus.generator.config.converts;
 
 import com.baomidou.mybatisplus.generator.config.GlobalConfig;
 import com.baomidou.mybatisplus.generator.config.ITypeConvert;
-import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
 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 字段类型转换
  *
  * @author hubin
+ * @author hanchunlin
  * @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) {
-        String t = fieldType.toLowerCase();
-        if (t.contains("char") || t.contains("xml")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("bigint")) {
-            return DbColumnType.LONG;
-        } else if (t.contains("int")) {
-            return DbColumnType.INTEGER;
-        } else if (t.contains("date") || t.contains("time")) {
-            switch (globalConfig.getDateType()) {
-                case ONLY_DATE:
-                    return DbColumnType.DATE;
-                case SQL_PACK:
-                    switch (t) {
-                        case "date":
-                            return DbColumnType.DATE_SQL;
-                        case "time":
-                            return DbColumnType.TIME;
-                        default:
-                            return DbColumnType.TIMESTAMP;
-                    }
-                case TIME_PACK:
-                    switch (t) {
-                        case "date":
-                            return DbColumnType.LOCAL_DATE;
-                        case "time":
-                            return DbColumnType.LOCAL_TIME;
-                        default:
-                            return DbColumnType.LOCAL_DATE_TIME;
-                    }
-                default:
-                    return DbColumnType.DATE;
-            }
-        } else if (t.contains("text")) {
-            return DbColumnType.STRING;
-        } else if (t.contains("bit")) {
-            return DbColumnType.BOOLEAN;
-        } else if (t.contains("decimal") || t.contains("numeric")) {
-            return DbColumnType.DOUBLE;
-        } else if (t.contains("money")) {
-            return DbColumnType.BIG_DECIMAL;
-        } else if (t.contains("binary") || t.contains("image")) {
-            return DbColumnType.BYTE_ARRAY;
-        } else if (t.contains("float") || t.contains("real")) {
-            return DbColumnType.FLOAT;
-        }
-        return DbColumnType.STRING;
+        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(contains("bit").then(BOOLEAN))
+            .test(containsAny("decimal", "numeric").then(DOUBLE))
+            .test(contains("money").then(BIG_DECIMAL))
+            .test(containsAny("binary", "image").then(BYTE_ARRAY))
+            .test(containsAny("float", "real").then(FLOAT))
+            .or(STRING);
     }
 
 }

+ 27 - 49
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/SqliteTypeConvert.java

@@ -19,62 +19,40 @@ import com.baomidou.mybatisplus.generator.config.GlobalConfig;
 import com.baomidou.mybatisplus.generator.config.ITypeConvert;
 import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
 import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
+
+import static com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert.toDateType;
+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.*;
+
 /**
  * SQLite 字段类型转换
  *
  * @author chen_wj
+ * @author hanchunlin
  * @since 2019-05-08
  */
 public class SqliteTypeConvert implements ITypeConvert {
+    public static final SqliteTypeConvert INSTANCE = new SqliteTypeConvert();
+
+    /**
+     * @inheritDoc
+     * @see MySqlTypeConvert#toDateType(GlobalConfig, String)
+     */
     @Override
-    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
-        String t = fieldType.toLowerCase();
-        if (t.contains("bigint")) {
-            return DbColumnType.LONG;
-        } else if (t.contains("tinyint(1)") || t.contains("boolean")) {
-            return DbColumnType.BOOLEAN;
-        } else if (t.contains("int")) {
-            return DbColumnType.INTEGER;
-        } else if (t.contains("text") || t.contains("char") || t.contains("enum") ) {
-            return DbColumnType.STRING;
-        } else if (t.contains("decimal") || t.contains("numeric")) {
-            return DbColumnType.BIG_DECIMAL;
-        } else if (t.contains("clob")) {
-            return DbColumnType.CLOB;
-        } else if (t.contains("blob")) {
-            return DbColumnType.BLOB;
-        } else if (t.contains("float")) {
-            return DbColumnType.FLOAT;
-        } else if (t.contains("double")) {
-            return DbColumnType.DOUBLE;
-        } else if (t.contains("date") || t.contains("time") || t.contains("year")) {
-            switch (globalConfig.getDateType()) {
-                case ONLY_DATE:
-                    return DbColumnType.DATE;
-                case SQL_PACK:
-                    switch (t) {
-                        case "date":
-                            return DbColumnType.DATE_SQL;
-                        case "time":
-                            return DbColumnType.TIME;
-                        case "year":
-                            return DbColumnType.DATE_SQL;
-                        default:
-                            return DbColumnType.TIMESTAMP;
-                    }
-                case TIME_PACK:
-                    switch (t) {
-                        case "date":
-                            return DbColumnType.LOCAL_DATE;
-                        case "time":
-                            return DbColumnType.LOCAL_TIME;
-                        case "year":
-                            return DbColumnType.YEAR;
-                        default:
-                            return DbColumnType.LOCAL_DATE_TIME;
-                    }
-            }
-        }
-        return DbColumnType.STRING;
+    public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
+        return TypeConverts.use(fieldType)
+            .test(contains("bigint").then(LONG))
+            .test(containsAny("tinyint(1)", "boolean").then(BOOLEAN))
+            .test(contains("int").then(INTEGER))
+            .test(containsAny("text", "char", "enum").then(STRING))
+            .test(containsAny("decimal", "numeric").then(BIG_DECIMAL))
+            .test(contains("clob").then(CLOB))
+            .test(contains("blob").then(BLOB))
+            .test(contains("float").then(FLOAT))
+            .test(contains("double").then(DOUBLE))
+            .test(containsAny("date", "time", "year").then(t -> toDateType(config, t)))
+            .or(DbColumnType.STRING);
     }
+
 }

+ 0 - 49
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/TypeConvertRegistry.java

@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2011-2020, baomidou (jobob@qq.com).
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.baomidou.mybatisplus.generator.config.converts;
-
-import com.baomidou.mybatisplus.annotation.DbType;
-import com.baomidou.mybatisplus.generator.config.ITypeConvert;
-
-import java.util.EnumMap;
-import java.util.Map;
-
-/**
- * @author nieqiuqiu
- * @date 2020-01-09
- * @since 3.3.1
- */
-public class TypeConvertRegistry {
-
-    private final Map<DbType, ITypeConvert> type_convert_enum_map = new EnumMap<>(DbType.class);
-
-    public TypeConvertRegistry() {
-        type_convert_enum_map.put(DbType.ORACLE, new OracleTypeConvert());
-        type_convert_enum_map.put(DbType.SQL_SERVER, new SqlServerTypeConvert());
-        type_convert_enum_map.put(DbType.POSTGRE_SQL, new PostgreSqlTypeConvert());
-        type_convert_enum_map.put(DbType.DB2, new DB2TypeConvert());
-        type_convert_enum_map.put(DbType.SQLITE, new SqliteTypeConvert());
-        type_convert_enum_map.put(DbType.DM, new DmTypeConvert());
-        type_convert_enum_map.put(DbType.MARIADB, new MySqlTypeConvert());
-        type_convert_enum_map.put(DbType.KINGBASE_ES, new KingbaseESTypeConvert());
-        type_convert_enum_map.put(DbType.MYSQL, new MySqlTypeConvert());
-        type_convert_enum_map.put(DbType.GAUSS, new GaussTypeConvert());
-    }
-
-    public ITypeConvert getTypeConvert(DbType dbType) {
-        return type_convert_enum_map.get(dbType);
-    }
-}

+ 90 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/TypeConverts.java

@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2011-2020, baomidou (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * https://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.generator.config.converts;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.generator.config.ITypeConvert;
+import com.baomidou.mybatisplus.generator.config.converts.select.BranchBuilder;
+import com.baomidou.mybatisplus.generator.config.converts.select.Selector;
+import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
+
+/**
+ * 该注册器负责注册并查询类型注册器
+ *
+ * @author nieqiuqiu
+ * @author hanchunlin
+ * @since 3.3.1
+ */
+public class TypeConverts {
+
+    /**
+     * 查询数据库类型对应的类型转换器
+     *
+     * @param dbType 数据库类型
+     * @return 返回转换器
+     */
+    public static ITypeConvert getTypeConvert(DbType dbType) {
+        switch (dbType) {
+            case ORACLE:
+                return OracleTypeConvert.INSTANCE;
+            case DB2:
+                return DB2TypeConvert.INSTANCE;
+            case DM:
+            case GAUSS:
+                return DmTypeConvert.INSTANCE;
+            case KINGBASE_ES:
+                return KingbaseESTypeConvert.INSTANCE;
+            case MYSQL:
+            case MARIADB:
+                return MySqlTypeConvert.INSTANCE;
+            case POSTGRE_SQL:
+                return PostgreSqlTypeConvert.INSTANCE;
+            case SQLITE:
+                return SqliteTypeConvert.INSTANCE;
+            case SQL_SERVER:
+                return SqlServerTypeConvert.INSTANCE;
+        }
+        return null;
+    }
+
+    static Selector<String, IColumnType> use(String param) {
+        return new Selector<>(param.toLowerCase());
+    }
+
+    /**
+     * 这个分支构建器用于构建用于支持 {@link String#contains(CharSequence)} 的分支
+     *
+     * @param value 分支的值
+     * @return 返回分支构建器
+     * @see #containsAny(CharSequence...)
+     */
+    static BranchBuilder<String, IColumnType> contains(CharSequence value) {
+        return BranchBuilder.of(s -> s.contains(value));
+    }
+
+    /**
+     * @see #contains(CharSequence)
+     */
+    static BranchBuilder<String, IColumnType> containsAny(CharSequence... values) {
+        return BranchBuilder.of(s -> {
+            for (CharSequence value : values) {
+                if (s.contains(value)) return true;
+            }
+            return false;
+        });
+    }
+
+}

+ 0 - 3
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/package-info.java

@@ -13,7 +13,4 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-/**
- * 代码生成器,类型转换相关类
- */
 package com.baomidou.mybatisplus.generator.config.converts;

+ 30 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/select/Branch.java

@@ -0,0 +1,30 @@
+package com.baomidou.mybatisplus.generator.config.converts.select;
+
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+/**
+ * 分支提供者
+ *
+ * @author hanchunlin
+ * Created at 2020/6/11 17:19
+ */
+public interface Branch<P, T> {
+    Predicate<P> tester();
+
+    Function<P, T> factory();
+
+    static <P, T> Branch<P, T> of(Predicate<P> tester, Function<P, T> factory) {
+        return new Branch<P, T>() {
+            @Override
+            public Predicate<P> tester() {
+                return tester;
+            }
+
+            @Override
+            public Function<P, T> factory() {
+                return factory;
+            }
+        };
+    }
+}

+ 24 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/select/BranchBuilder.java

@@ -0,0 +1,24 @@
+package com.baomidou.mybatisplus.generator.config.converts.select;
+
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+/**
+ * 分支构建者
+ *
+ * @author hanchunlin
+ * Created at 2020/6/11 17:22
+ */
+public interface BranchBuilder<P, T> {
+
+    Branch<P, T> then(Function<P, T> factory);
+
+    default Branch<P, T> then(T value) {
+        return then(p -> value);
+    }
+
+    static <P, T> BranchBuilder<P, T> of(Predicate<P> tester) {
+        return factory -> Branch.of(tester, factory);
+    }
+
+}

+ 58 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/select/Selector.java

@@ -0,0 +1,58 @@
+package com.baomidou.mybatisplus.generator.config.converts.select;
+
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+/**
+ * 分支结果选择器
+ *
+ * @author hanchunlin
+ * Created at 2020/6/11 16:55
+ */
+public class Selector<P, T> {
+    private boolean success = false;
+    private Function<P, T> factory;
+    private final P param;
+
+    public Selector(P param) {
+        this.param = param;
+    }
+
+    /**
+     * 使用指定的参数创建选择器
+     *
+     * @param param 参数
+     * @param <P>   参数类型
+     * @param <T>   返回值类型
+     * @return 返回选择器自身
+     */
+    public static <P, T> Selector<P, T> param(P param) {
+        return new Selector<>(param);
+    }
+
+    /**
+     * 传入一个新的分支,如果这个分支满足条件
+     *
+     * @param branch 则当前选择器将接受当前分支的结果并完成
+     * @return 选择器自身
+     */
+    public Selector<P, T> test(Branch<P, T> branch) {
+        if (!success) {
+            boolean pass = branch.tester().test(param);
+            if (pass) {
+                success = true;
+                factory = branch.factory();
+            }
+        }
+        return this;
+    }
+
+    public T or(Supplier<T> supplier) {
+        return success ? this.factory.apply(param) : supplier.get();
+    }
+
+    public T or(T t) {
+        return or(() -> t);
+    }
+
+}

+ 8 - 12
mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/test/generator/KingbaseESGenerator.java

@@ -15,27 +15,23 @@
  */
 package com.baomidou.mybatisplus.test.generator;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.generator.AutoGenerator;
 import com.baomidou.mybatisplus.generator.InjectionConfig;
-import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
-import com.baomidou.mybatisplus.generator.config.FileOutConfig;
-import com.baomidou.mybatisplus.generator.config.GlobalConfig;
-import com.baomidou.mybatisplus.generator.config.PackageConfig;
-import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.*;
 import com.baomidou.mybatisplus.generator.config.converts.OracleTypeConvert;
 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
 import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
 import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * KingbaseESGenerator
  *
@@ -77,9 +73,9 @@ public class KingbaseESGenerator extends GeneratorTest {
         dsc.setTypeConvert(new OracleTypeConvert() {
             // 自定义数据库表字段类型转换【可选】
             @Override
-            public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
+            public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
                 System.out.println("转换类型:" + fieldType);
-                return super.processTypeConvert(globalConfig, fieldType);
+                return super.processTypeConvert(config, fieldType);
             }
         });
         // 自定义数据库信息查询

+ 5 - 10
mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/test/generator/MysqlGenerator.java

@@ -15,18 +15,11 @@
  */
 package com.baomidou.mybatisplus.test.generator;
 
-import java.util.*;
-
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.generator.AutoGenerator;
 import com.baomidou.mybatisplus.generator.InjectionConfig;
-import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
-import com.baomidou.mybatisplus.generator.config.FileOutConfig;
-import com.baomidou.mybatisplus.generator.config.GlobalConfig;
-import com.baomidou.mybatisplus.generator.config.PackageConfig;
-import com.baomidou.mybatisplus.generator.config.StrategyConfig;
-import com.baomidou.mybatisplus.generator.config.TemplateConfig;
+import com.baomidou.mybatisplus.generator.config.*;
 import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
 import com.baomidou.mybatisplus.generator.config.po.TableFill;
 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
@@ -36,6 +29,8 @@ import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
 import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
 import com.mysql.cj.jdbc.Driver;
 
+import java.util.*;
+
 /**
  * 代码生成器演示
  *
@@ -79,12 +74,12 @@ public class MysqlGenerator extends GeneratorTest {
                 .setTypeConvert(new MySqlTypeConvert() {
                     // 自定义数据库表字段类型转换【可选】
                     @Override
-                    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
+                    public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
                         System.out.println("转换类型:" + fieldType);
                         // if ( fieldType.toLowerCase().contains( "tinyint" ) ) {
                         //    return DbColumnType.BOOLEAN;
                         // }
-                        return super.processTypeConvert(globalConfig, fieldType);
+                        return super.processTypeConvert(config, fieldType);
                     }
                 })
                 .setDbQuery(new MySqlQuery() {

+ 8 - 12
mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/test/generator/PostgreSQLGenerator.java

@@ -15,27 +15,23 @@
  */
 package com.baomidou.mybatisplus.test.generator;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.generator.AutoGenerator;
 import com.baomidou.mybatisplus.generator.InjectionConfig;
-import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
-import com.baomidou.mybatisplus.generator.config.FileOutConfig;
-import com.baomidou.mybatisplus.generator.config.GlobalConfig;
-import com.baomidou.mybatisplus.generator.config.PackageConfig;
-import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.*;
 import com.baomidou.mybatisplus.generator.config.converts.OracleTypeConvert;
 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
 import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
 import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * PostgreSQLGenerator
  *
@@ -77,9 +73,9 @@ public class PostgreSQLGenerator extends GeneratorTest {
         dsc.setTypeConvert(new OracleTypeConvert() {
             // 自定义数据库表字段类型转换【可选】
             @Override
-            public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
+            public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
                 System.out.println("转换类型:" + fieldType);
-                return super.processTypeConvert(globalConfig, fieldType);
+                return super.processTypeConvert(config, fieldType);
             }
         });
         // 自定义数据库信息查询