Kaynağa Gözat

代码生成器添加达梦数据库支持

halower 5 yıl önce
ebeveyn
işleme
27a35b55c6

+ 1 - 0
build.gradle

@@ -66,6 +66,7 @@ ext {
         "sqlserver"             : "com.microsoft.sqlserver:sqljdbc4:4.0",
         "postgresql"            : "org.postgresql:postgresql:9.4.1212",
         "oracle"                : fileTree(dir: 'libs', includes: ['ojdbc-11.2.0.3-jdk16.jar']),
+        "dm"                    : fileTree(dir: 'libs', includes: ['dialect-hibernate5.0.jar', "hibernateSpatial-1.0.jar","jdbcDriver-18.jar"]),
         "h2"                    : "com.h2database:h2:1.4.197",
         "mysql"                 : "mysql:mysql-connector-java:8.0.15",
         "sqlite"                : "org.xerial:sqlite-jdbc:3.27.2.1",

+ 1 - 0
mybatis-plus-generator/build.gradle

@@ -8,6 +8,7 @@ dependencies {
     testCompile "${lib.sqlserver}"
     testCompile "${lib.postgresql}"
     testCompile lib.oracle as ConfigurableFileTree
+    testCompile lib.dm as ConfigurableFileTree
     testCompile "${lib.h2}"
     testCompile "${lib.mysql}"
     testCompile "${lib.sqlite}"

+ 6 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/DataSourceConfig.java

@@ -93,6 +93,9 @@ public class DataSourceConfig {
                 case SQLITE:
                     dbQuery = new SqliteQuery();
                     break;
+                case DM:
+                    dbQuery = new DMQuery();
+                    break;
                 default:
                     // 默认 MYSQL
                     dbQuery = new MySqlQuery();
@@ -167,6 +170,9 @@ public class DataSourceConfig {
                 case SQLITE:
                     typeConvert = new SqliteTypeConvert();
                     break;
+                case DM:
+                    typeConvert = new DmTypeConvert();
+                    break;
                 case MARIADB:
                     typeConvert = new MySqlTypeConvert();
                     break;

+ 6 - 2
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/builder/ConfigBuilder.java

@@ -556,7 +556,11 @@ public class ConfigBuilder {
             } else if (DbType.ORACLE == dbType) {
                 tableName = tableName.toUpperCase();
                 tableFieldsSql = String.format(tableFieldsSql.replace("#schema", dataSourceConfig.getSchemaName()), tableName);
-            } else if (DbType.H2 == dbType) {
+            } else if (DbType.DM == dbType) {
+                tableName = tableName.toUpperCase();
+                tableFieldsSql = String.format(tableFieldsSql, tableName);
+            }
+            else if (DbType.H2 == dbType) {
                 tableName = tableName.toUpperCase();
                 try (PreparedStatement pkQueryStmt = connection.prepareStatement(String.format(H2Query.PK_QUERY_SQL, tableName));
                      ResultSet pkResults = pkQueryStmt.executeQuery()) {
@@ -578,7 +582,7 @@ public class ConfigBuilder {
                     TableField field = new TableField();
                     String columnName = results.getString(dbQuery.fieldName());
                     // 避免多重主键设置,目前只取第一个找到ID,并放到list中的索引为0的位置
-                    boolean isId;
+                    boolean isId = false;
                     if (DbType.H2 == dbType) {
                         isId = h2PkColumns.contains(columnName);
                     } else {

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

@@ -26,7 +26,7 @@ import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
  * @author zhanyao
  * @since 2018-05-16
  */
-public class DB2TypeConvert implements ITypeConvert {
+public class  DB2TypeConvert implements ITypeConvert {
 
     @Override
     public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {

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

@@ -0,0 +1,138 @@
+/*
+ * 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;
+
+/**
+ * DM 字段类型转换
+ *
+ * @author halower
+ * @since 2019-06-27
+ */
+public class DmTypeConvert implements ITypeConvert {
+
+    @Override
+    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
+        String t = fieldType.toLowerCase();
+        DbColumnType dbColumnType = new BasicDataTypeHandler().getDbColumnType(t);
+        return dbColumnType;
+    }
+
+     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;
+        }
+    }
+}

+ 68 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/querys/DMQuery.java

@@ -0,0 +1,68 @@
+package com.baomidou.mybatisplus.generator.config.querys;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+
+/**
+ * DM 表数据查询
+ *
+ * @author halower
+ * @since 2019-06-27
+ */
+public class DMQuery  extends AbstractDbQuery{
+    @Override
+    public DbType dbType() {
+        return DbType.DM;
+    }
+
+    @Override
+    public String tablesSql() {
+        return "SELECT DISTINCT T1.TABLE_NAME,T2.COMMENTS AS TABLE_COMMENT FROM USER_TAB_COLUMNS T1 " +
+            "INNER JOIN USER_TAB_COMMENTS T2 ON T1.TABLE_NAME = T2.TABLE_NAME";
+    }
+
+    @Override
+    public String tableFieldsSql() {
+        return
+            "SELECT T2.COLUMN_NAME,T1.COMMENTS,T2.DATA_TYPE," +
+            "CASE WHEN CONSTRAINT_TYPE='P' THEN 'PRI' END AS KEY " +
+            "FROM  USER_COL_COMMENTS T1,USER_TAB_COLUMNS T2," +
+              "( SELECT T4.TABLE_NAME ,T4.COLUMN_NAME,T5.CONSTRAINT_TYPE " +
+               " FROM USER_CONS_COLUMNS T4,USER_CONSTRAINTS T5 " +
+               "WHERE T4.CONSTRAINT_NAME = T5.CONSTRAINT_NAME AND T5.CONSTRAINT_TYPE = 'P') T3 " +
+            "WHERE T1.TABLE_NAME = T2.TABLE_NAME AND "+
+            "T1.COLUMN_NAME=T2.COLUMN_NAME AND "+
+            "T1.COLUMN_NAME=T2.COLUMN_NAME AND "+
+            "T1.TABLE_NAME=T3.TABLE_NAME AND "+
+            "T1.COLUMN_NAME=T3.COLUMN_NAME AND "+
+             "T1.TABLE_NAME = '%s'";
+    }
+
+    @Override
+    public String tableName() {
+        return "TABLE_NAME";
+    }
+    @Override
+    public String tableComment() {
+        return "TABLE_COMMENT";
+    }
+
+    @Override
+    public String fieldName() {
+        return "COLUMN_NAME";
+    }
+
+    @Override
+    public String fieldType() {
+        return "DATA_TYPE";
+    }
+
+    @Override
+    public String fieldComment() {
+        return "COMMENTS";
+    }
+
+    @Override
+    public String fieldKey() {
+        return "KEY";
+    }
+}

+ 150 - 0
mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/test/generator/DMGenerator.java

@@ -0,0 +1,150 @@
+/*
+ * 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.test.generator;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.querys.DMQuery;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+/**
+ * MDGenerator
+ *
+ * @author halower
+ * @since 2019/6/28
+ */
+public class DMGenerator {
+
+    public static String scanner(String tip) {
+        Scanner scanner = new Scanner(System.in);
+        StringBuilder help = new StringBuilder();
+        help.append("请输入" + tip + ":");
+        System.out.println(help.toString());
+        if (scanner.hasNext()) {
+            String ipt = scanner.next();
+            if (StringUtils.isNotEmpty(ipt)) {
+                return ipt;
+            }
+        }
+        throw new MybatisPlusException("请输入正确的" + tip + "!");
+    }
+
+    public static void main(String[] args) {
+        // 代码生成器
+        AutoGenerator mpg = new AutoGenerator();
+
+        // 全局配置
+        GlobalConfig gc = new GlobalConfig();
+        String projectPath = System.getProperty("user.dir");
+        gc.setOutputDir("D://mpg");
+        gc.setAuthor("halower");
+        gc.setOpen(false);
+        // gc.setSwagger2(true); 实体属性 Swagger2 注解
+        mpg.setGlobalConfig(gc);
+
+        // 数据源配置
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:dm://192.168.2.226:5236");
+        dsc.setDriverName("dm.jdbc.driver.DmDriver");
+        dsc.setUsername("TYYW2_LCBA");
+        dsc.setPassword("tyyw2_lcba");
+        dsc.setDbType(DbType.DM);
+        dsc.setDbQuery(new DMQuery());
+        mpg.setDataSource(dsc);
+
+        // 包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setModuleName(scanner("模块名"));
+        pc.setParent("com.baomidou.mytest");
+        mpg.setPackageInfo(pc);
+
+        // 自定义配置
+        InjectionConfig cfg = new InjectionConfig() {
+            @Override
+            public void initMap() {
+                // to do nothing
+            }
+        };
+
+        // 如果模板引擎是 freemarker
+        String templatePath = "/templates/mapper.xml.ftl";
+        // 如果模板引擎是 velocity
+        // String templatePath = "/templates/mapper.xml.vm";
+
+        // 自定义输出配置
+        List<FileOutConfig> focList = new ArrayList<>();
+        // 自定义配置会被优先输出
+        focList.add(new FileOutConfig(templatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return "D://mpg/mapper/" + pc.getModuleName()
+                    + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
+            }
+        });
+        /*
+        cfg.setFileCreate(new IFileCreate() {
+            @Override
+            public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
+                // 判断自定义文件夹是否需要创建
+                checkDir("调用默认方法创建的目录");
+                return false;
+            }
+        });
+        */
+        cfg.setFileOutConfigList(focList);
+        mpg.setCfg(cfg);
+
+        // 配置模板
+        TemplateConfig templateConfig = new TemplateConfig();
+
+        // 配置自定义输出模板
+        //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
+        // templateConfig.setEntity("templates/entity2.java");
+        // templateConfig.setService();
+        // templateConfig.setController();
+
+        templateConfig.setXml(null);
+        mpg.setTemplate(templateConfig);
+
+        // 策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setNaming(NamingStrategy.underline_to_camel);
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+//        strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");
+        strategy.setEntityLombokModel(true);
+        strategy.setRestControllerStyle(true);
+//        strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
+        strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
+        strategy.setSuperEntityColumns("id");
+        strategy.setControllerMappingHyphenStyle(true);
+        strategy.setTablePrefix(pc.getModuleName() + "_");
+        mpg.setStrategy(strategy);
+        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
+        mpg.execute();
+    }
+}