Browse Source

!120 增加Oscar(神通数据库)代码生成支持
* Merge remote-tracking branch 'upstream/3.0' into 3.0
* 增加Oscar(神通数据库)代码生成支持

whli 4 years ago
parent
commit
66f7b9d4a3

+ 20 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/OscarDialect.java

@@ -0,0 +1,20 @@
+package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.DialectModel;
+
+/**
+ * 神通数据分页方言
+ *
+ * @author wangheli
+ * @version 1.0.0
+ * @since 2020/7/25 9:13
+ */
+public class OscarDialect implements IDialect {
+
+    @Override
+    public DialectModel buildPaginationSql(String originalSql, long offset, long limit) {
+        String sql = originalSql + " LIMIT " + FIRST_MARK + " OFFSET " + SECOND_MARK;
+        return new DialectModel(sql, offset, limit).setConsumerChain();
+    }
+
+}

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

@@ -136,6 +136,8 @@ public class DataSourceConfig {
             return DbType.DM;
         } else if (str.contains("zenith")) {
             return DbType.GAUSS;
+        } else if (str.contains("oscar")) {
+            return DbType.OSCAR;
         } else {
             return DbType.OTHER;
         }

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

@@ -588,6 +588,8 @@ public class ConfigBuilder {
                 tableFieldsSql = String.format(tableFieldsSql, dataSourceConfig.getSchemaName(), tableName);
             } else if (DbType.KINGBASE_ES == dbType) {
                 tableFieldsSql = String.format(tableFieldsSql, dataSourceConfig.getSchemaName(), tableName);
+            } else if (DbType.OSCAR == dbType) {
+                tableFieldsSql = String.format(tableFieldsSql, tableName);
             } else if (DbType.DB2 == dbType) {
                 tableFieldsSql = String.format(tableFieldsSql, dataSourceConfig.getSchemaName(), tableName);
             } else if (DbType.ORACLE == dbType) {

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

@@ -0,0 +1,89 @@
+/*
+ * 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.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, hanchunlin
+ * @since 2019-10-12
+ */
+public class OscarTypeConvert implements ITypeConvert {
+    public static final OscarTypeConvert INSTANCE = new OscarTypeConvert();
+
+    /**
+     * @param globalConfig 全局配置
+     * @param fieldType    字段类型
+     * @return 返回对应的字段类型
+     */
+    @Override
+    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
+        return TypeConverts.use(fieldType)
+            .test(containsAny("CHARACTER", "char", "varchar", "text", "character varying").then(STRING))
+            .test(containsAny("bigint", "int8").then(LONG))
+            .test(containsAny("int", "int1", "int2", "int3", "int4", "tinyint", "integer").then(INTEGER))
+            .test(containsAny("date", "time", "timestamp").then(p -> toDateType(globalConfig, p)))
+            .test(containsAny("bit", "boolean").then(BOOLEAN))
+            .test(containsAny("decimal", "numeric", "number").then(BIG_DECIMAL))
+            .test(contains("clob").then(CLOB))
+            .test(contains("blob").then(BYTE_ARRAY))
+            .test(contains("float").then(FLOAT))
+            .test(containsAny("double", "real", "float4", "float8").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 TIMESTAMP;
+            }
+        } else if (dateType == DateType.TIME_PACK) {
+            switch (type) {
+                case "date":
+                    return LOCAL_DATE;
+                case "time":
+                    return LOCAL_TIME;
+                default:
+                    return LOCAL_DATE_TIME;
+            }
+        }
+        return DbColumnType.DATE;
+    }
+
+}

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

@@ -46,6 +46,8 @@ public class TypeConverts {
                 return DmTypeConvert.INSTANCE;
             case KINGBASE_ES:
                 return KingbaseESTypeConvert.INSTANCE;
+            case OSCAR:
+                return OscarTypeConvert.INSTANCE;
             case MYSQL:
             case MARIADB:
                 return MySqlTypeConvert.INSTANCE;

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

@@ -42,6 +42,7 @@ public class DbQueryRegistry {
         db_query_enum_map.put(DbType.KINGBASE_ES, new KingbaseESQuery());
         db_query_enum_map.put(DbType.MYSQL, new MySqlQuery());
         db_query_enum_map.put(DbType.GAUSS, new GaussQuery());
+        db_query_enum_map.put(DbType.OSCAR, new OscarQuery());
     }
 
     public IDbQuery getDbQuery(DbType dbType) {

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

@@ -0,0 +1,66 @@
+package com.baomidou.mybatisplus.generator.config.querys;
+
+/**
+ * <p></p>
+ *
+ * @author whli
+ * @version 1.0.0
+ * @since 2020/7/28 18:54
+ */
+public class OscarQuery extends AbstractDbQuery {
+
+    @Override
+    public String tablesSql() {
+        return "SELECT " +
+            "a.TABLE_NAME, " +
+            "b.COMMENTS " +
+            "FROM USER_TABLES a " +
+            "INNER JOIN USER_TAB_COMMENTS b ON (b.TABLE_TYPE = 'TABLE' AND a.TABLE_NAME = b.TABLE_NAME) ";
+    }
+
+    @Override
+    public String tableFieldsSql() {
+        return "SELECT " +
+            "T1.COLUMN_NAME, " +
+            "T1.DATA_TYPE, " +
+            "T2.COMMENTS, " +
+            "CASE WHEN T3.CONSTRAINT_TYPE = 'P' THEN 'PRI' " +
+            "ELSE '' END KEY " +
+            "FROM USER_TAB_COLUMNS T1 " +
+            "INNER JOIN USER_COL_COMMENTS T2 ON (T1.COLUMN_NAME = T2.COLUMN_NAME) " +
+            "LEFT JOIN(SELECT a.TABLE_NAME,b.COLUMN_NAME,a.CONSTRAINT_TYPE FROM USER_CONSTRAINTS a, USER_IND_COLUMNS b " +
+            "WHERE a.CONSTRAINT_TYPE = 'P' AND a.INDEX_NAME = b.INDEX_NAME) T3 ON (T1.TABLE_NAME = T3.TABLE_NAME AND T1.COLUMN_NAME = T3.COLUMN_NAME) " +
+            "WHERE T1.TABLE_NAME = '%s' " +
+            "GROUP BY T1.COLUMN_NAME,T1.DATA_TYPE,T2.COMMENTS,T3.CONSTRAINT_TYPE ";
+    }
+
+    @Override
+    public String tableName() {
+        return "TABLE_NAME";
+    }
+
+    @Override
+    public String tableComment() {
+        return "COMMENTS";
+    }
+
+    @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";
+    }
+}

+ 165 - 0
mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/test/generator/OscarGenerator.java

@@ -0,0 +1,165 @@
+/*
+ * 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.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.*;
+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
+ *
+ * @author kingbase
+ * @since 2019/10/12
+ */
+public class OscarGenerator extends GeneratorTest {
+
+    public static void main(String[] args) {
+        int result = scanner();
+        AutoGenerator mpg = new AutoGenerator();
+
+        // 全局配置
+        GlobalConfig gc = new GlobalConfig();
+        gc.setOutputDir("D://");
+        gc.setFileOverride(true);
+        gc.setActiveRecord(true);// 开启 activeRecord 模式
+        gc.setEnableCache(false);// XML 二级缓存
+        gc.setBaseResultMap(true);// XML ResultMap
+        gc.setBaseColumnList(false);// XML columList
+        //gc.setKotlin(true); // 是否生成 kotlin 代码
+        //gc.setSwagger2(true); // 是否生成 Swagger2 注解
+        gc.setAuthor("oscar");
+        gc.setIdType(IdType.ASSIGN_ID);
+
+        // 自定义文件命名,注意 %s 会自动填充表实体属性!
+        // gc.setEntityName("%sEntity");
+        // gc.setMapperName("%sDao");
+        // gc.setXmlName("%sDao");
+        // gc.setServiceName("MP%sService");
+        // gc.setServiceImplName("%sServiceDiy");
+        // gc.setControllerName("%sAction");
+        mpg.setGlobalConfig(gc);
+
+        // 数据源配置
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setDbType(DbType.OSCAR);
+        dsc.setTypeConvert(new OracleTypeConvert() {
+            // 自定义数据库表字段类型转换【可选】
+            @Override
+            public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
+                System.out.println("转换类型:" + fieldType);
+                return super.processTypeConvert(config, fieldType);
+            }
+        });
+        // 自定义数据库信息查询
+        dsc.setDbQuery(new MyKingbaseESQuery());
+        dsc.setDriverName("com.oscar.Driver");
+        dsc.setUsername("MYBATIS_PLUS");
+        dsc.setPassword("123456");
+        dsc.setUrl("jdbc:oscar://localhost:2003/mybatis-plus");
+        mpg.setDataSource(dsc);
+
+        // 策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        // strategy.setCapitalMode(true);// 全局大写命名
+        // strategy.setDbColumnUnderline(true);// 全局下划线命名
+        strategy.setTablePrefix("BMD_", "MP_");// 表前缀
+        strategy.setFieldPrefix("A_");
+        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);// 允许字段策略独立设置,默认为 naming 策略
+        strategy.setInclude("T_USER", "^MP.*", "OK"); // 需要生成的表,支持正则表达式
+        // strategy.setExclude("test"); // 排除生成的表,支持正则表达式
+        // 自定义实体父类
+        // strategy.setSuperEntityClass("com.baomidou.demo.TestEntity");
+        // 自定义实体,公共字段
+        // strategy.setSuperEntityColumns(new String[] { "test_id", "age" });
+        // 自定义 mapper 父类
+        // strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");
+        // 自定义 service 父类
+        // strategy.setSuperServiceClass("com.baomidou.demo.TestService");
+        // 自定义 service 实现类父类
+        // strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl");
+        // 自定义 controller 父类
+        // strategy.setSuperControllerClass("com.baomidou.demo.TestController");
+        // 【实体】是否生成字段常量(默认 false)
+        // public static final String ID = "test_id";
+        // strategy.setEntityColumnConstant(true);
+        // 【实体】是否为构建者模型(默认 false)
+        // public User setName(String name) {this.name = name; return this;}
+        // strategy.setEntityBuliderModel(true);
+        mpg.setStrategy(strategy);
+
+        // 包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setModuleName("test");
+        pc.setParent("com.baomidou");// 自定义包路径
+        pc.setController("controller");// 这里是控制器包名,默认 web
+        mpg.setPackageInfo(pc);
+
+        // 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
+        InjectionConfig cfg = new InjectionConfig() {
+            @Override
+            public void initMap() {
+                Map<String, Object> map = new HashMap<>();
+                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
+                this.setMap(map);
+            }
+        };
+        List<FileOutConfig> focList = new ArrayList<>();
+        focList.add(new FileOutConfig("/templates/dto.java" + ((1 == result) ? ".ftl" : ".vm")) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输入文件名称
+                return "D://test/my_" + tableInfo.getEntityName() + StringPool.DOT_JAVA;
+            }
+        });
+        cfg.setFileOutConfigList(focList);
+        mpg.setCfg(cfg);
+
+        // 自定义模板配置,模板可以参考源码 /mybatis-plus/src/main/resources/template 使用 copy
+        // 至您项目 src/main/resources/template 目录下,模板名称也可自定义如下配置:
+        // TemplateConfig tc = new TemplateConfig();
+        // tc.setController("...");
+        // tc.setEntity("...");
+        // tc.setMapper("...");
+        // tc.setXml("...");
+        // tc.setService("...");
+        // tc.setServiceImpl("...");
+        // mpg.setTemplate(tc);
+
+        // 执行生成
+        if (1 == result) {
+            mpg.setTemplateEngine(new FreemarkerTemplateEngine());
+        }
+        mpg.execute();
+        // 打印注入设置
+        System.err.println(mpg.getCfg().getMap().get("abc"));
+    }
+
+}