Browse Source

修复达梦数据库代码生成.

nieqiurong 1 year ago
parent
commit
c7fafbae43

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

@@ -47,6 +47,7 @@ import java.util.Properties;
  * @since 2016/8/30
  */
 public class DataSourceConfig {
+
     protected final Logger logger = LoggerFactory.getLogger(DataSourceConfig.class);
 
     private DataSourceConfig() {
@@ -238,6 +239,13 @@ public class DataSourceConfig {
                         // 使用元数据查询方式时,有些数据库需要增加属性才能读取注释
                         this.processProperties(properties);
                         this.connection = DriverManager.getConnection(url, properties);
+                        if (StringUtils.isBlank(this.schemaName)) {
+                            try {
+                                this.schemaName = connection.getSchema();
+                            } catch (Exception exception) {
+                                // ignore 老古董1.7以下的驱动不支持.
+                            }
+                        }
                     }
                 }
             }

+ 13 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/IDbQuery.java

@@ -78,4 +78,17 @@ public interface IDbQuery {
      * 自定义字段名称
      */
     String[] fieldCustom();
+
+    /**
+     * 获取主键sql
+     *
+     * @param dataSourceConfig 数据库配置信息
+     * @param tableName        表名
+     * @return 主键查询sql
+     * @since 3.5.7
+     */
+    default String primaryKeySql(DataSourceConfig dataSourceConfig, String tableName) {
+        return null;
+    }
+
 }

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

@@ -15,6 +15,8 @@
  */
 package com.baomidou.mybatisplus.generator.config.querys;
 
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+
 /**
  * DM 表数据查询
  *
@@ -39,21 +41,26 @@ public class DMQuery extends AbstractDbQuery {
 
     @Override
     public String tableFieldsSql() {
-        return
-                "SELECT T2.COLUMN_NAME,T1.COMMENTS," +
-                        "CASE WHEN T2.DATA_TYPE='NUMBER' THEN (CASE WHEN T2.DATA_PRECISION IS NULL THEN T2.DATA_TYPE WHEN NVL(T2.DATA_SCALE, 0) > 0 THEN T2.DATA_TYPE||'('||T2.DATA_PRECISION||','||T2.DATA_SCALE||')' ELSE T2.DATA_TYPE||'('||T2.DATA_PRECISION||')' END) ELSE T2.DATA_TYPE END 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.TABLE_NAME = T3.TABLE_NAME(+) AND " +
-                        "T1.COLUMN_NAME=T3.COLUMN_NAME(+)   AND " +
-                        "T1.TABLE_NAME = '%s' and owner='%s' " +
-                        "ORDER BY T2.TABLE_NAME,T2.COLUMN_ID";
+        return "SELECT /*+ MAX_OPT_N_TABLES(5) */ DISTINCT NULL AS TABLE_CAT, SCHS.NAME AS TABLE_SCHEM, TABS.NAME AS TABLE_NAME, COLS.NAME AS COLUMN_NAME, \n" +
+            "CASE COLS.TYPE$ WHEN 'NUMBER' THEN 2 WHEN 'NUMERIC' THEN 2 WHEN 'TIMESTAMP' THEN 93 WHEN 'CHARACTER' THEN 1 WHEN 'VARCHAR' THEN 12 WHEN 'VARCHAR2' THEN 12 WHEN 'DEC' THEN 3 WHEN 'DECIMAL' THEN 3 WHEN 'BIT' THEN -7 \n" +
+            "WHEN 'INT' THEN 4 WHEN 'INTEGER' THEN 4 WHEN 'BIGINT' THEN -5 WHEN 'BYTE' THEN -6 WHEN 'TINYINT' THEN -6 WHEN 'SMALLINT' THEN 5 WHEN 'BINARY' THEN -2 WHEN 'VARBINARY' THEN -3 WHEN 'FLOAT' THEN 6 WHEN 'DOUBLE' THEN 8\n" +
+            " WHEN 'REAL' THEN 7 WHEN 'DOUBLE PRECISION' THEN 8 WHEN 'DATE' THEN 91 WHEN 'TIME' THEN 92 WHEN 'DATETIME' THEN 93 WHEN 'TEXT' THEN -1 WHEN 'LONGVARCHAR' THEN -1 WHEN 'IMAGE' THEN -4 WHEN 'LONGVARBINARY' THEN -4 \n" +
+            " WHEN 'BLOB' THEN 2004 WHEN 'CLOB' THEN 2005 WHEN 'CURSOR' THEN -10 WHEN 'BOOL' THEN 16 WHEN 'BOOLEAN' THEN 16 ELSE SF_GET_DATA_TYPE(COLS.TYPE$, CAST(COLS.SCALE AS INT), 3) END AS DATA_TYPE,CASE INSTR(COLS.TYPE$,'CLASS',1,1)\n" +
+            "  WHEN 0 THEN COLS.TYPE$ ELSE SF_GET_CLASS_NAME(COLS.TYPE$) END AS TYPE_NAME,CASE SF_GET_COLUMN_SIZE(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) \n" +
+            "  WHEN -2 THEN NULL ELSE SF_GET_COLUMN_SIZE(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) END AS COLUMN_SIZE,CASE SF_GET_BUFFER_LEN(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) \n" +
+            "  WHEN -2 THEN NULL ELSE SF_GET_BUFFER_LEN(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT), CAST (COLS.SCALE AS INT)) END AS BUFFER_LENGTH,CASE SF_GET_DECIMAL_DIGITS(COLS.TYPE$, CAST (COLS.SCALE AS INT)) \n" +
+            "  WHEN -2 THEN NULL ELSE SF_GET_DECIMAL_DIGITS(COLS.TYPE$, CAST (COLS.SCALE AS INT)) END AS DECIMAL_DIGITS,10 AS NUM_PREC_RADIX,CASE COLS.NULLABLE$ WHEN 'Y' THEN 1 ELSE 0 END AS NULLABLE,\n" +
+            "  (SELECT COMMENT$ FROM SYSCOLUMNCOMMENTS WHERE SCHNAME=SCHS.NAME AND TVNAME=TABS.NAME AND COLNAME=COLS.NAME) AS REMARKS,COLS.DEFVAL AS COLUMN_DEF,0 AS SQL_DATA_TYPE,0 AS SQL_DATETIME_SUB,\n" +
+            "  CASE SF_GET_OCT_LENGTH(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT)) WHEN -2 THEN NULL ELSE SF_GET_OCT_LENGTH(COLS.TYPE$, CAST (COLS.LENGTH$ AS INT)) END AS CHAR_OCTET_LENGTH,COLS.COLID + 1 AS ORDINAL_POSITION,CASE COLS.NULLABLE$ \n" +
+            "  WHEN 'Y' THEN 'YES' ELSE 'NO' END AS IS_NULLABLE,NULL AS SCOPE_CATLOG,NULL AS SCOPE_SCHEMA,NULL AS SCOPE_TABLE,0 AS SOURCE_DATA_TYPE FROM\n" +
+            "   (\n" +
+            "   SELECT ID, NAME, PID FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCH' \n" +
+            "   AND NAME = '%s' \n" +
+            "   )  AS SCHS, (SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS \n" +
+            "   WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ IN('UTAB', 'STAB', 'VIEW')\n" +
+            "     AND NAME LIKE '%s' ESCAPE '!' \n" +
+            "     )  AS TABS, \n" +
+            "SYS.SYSCOLUMNS AS COLS WHERE TABS.ID = COLS.ID AND SCHS.ID = TABS.SCHID  ORDER BY TABLE_SCHEM ASC,TABLE_NAME ASC,ORDINAL_POSITION ASC";
     }
 
     @Override
@@ -77,11 +84,25 @@ public class DMQuery extends AbstractDbQuery {
 
     @Override
     public String fieldComment() {
-        return "COMMENTS";
+        return "REMARKS";
     }
 
     @Override
     public String fieldKey() {
         return "KEY";
     }
+
+    @Override
+    public String primaryKeySql(DataSourceConfig dataSourceConfig, String tableName) {
+        return "  SELECT /*+ MAX_OPT_N_TABLES(5) */ NULL AS TABLE_CAT, 'SYSDBA' AS TABLE_SCHEM,'" + tableName + "' AS TABLE_NAME,'true' AS key,\n" +
+            "  COLS.NAME AS COLUMN_NAME,SF_GET_INDEX_KEY_SEQ(INDS.KEYNUM, INDS.KEYINFO, COLS.COLID) AS KEY_SEQ,CONS.NAME AS PK_NAME FROM \n" +
+            "  SYS.SYSINDEXES INDS, (SELECT OBJ.NAME, CON.ID, CON.TYPE$, CON.TABLEID, CON.COLID, CON.INDEXID FROM SYS.SYSCONS AS CON, \n" +
+            "  SYS.SYSOBJECTS AS OBJ WHERE OBJ.SUBTYPE$='CONS' AND OBJ.ID=CON.ID) CONS, SYS.SYSCOLUMNS COLS, (SELECT NAME ,ID FROM SYS.SYSOBJECTS \n" +
+            "  WHERE SUBTYPE$='UTAB' \n" +
+            "  AND NAME = '" + tableName + "' \n" +
+            "  AND SCHID=(SELECT ID FROM SYS.SYSOBJECTS WHERE NAME = '" + dataSourceConfig.getSchemaName() + "' AND TYPE$='SCH')) TAB, (SELECT ID, NAME FROM SYS.SYSOBJECTS WHERE SUBTYPE$='INDEX')OBJ_INDS \n" +
+            "  WHERE CONS.TYPE$='P' AND CONS.INDEXID=INDS.ID AND INDS.ID=OBJ_INDS.ID AND TAB.ID=COLS.ID AND CONS.TABLEID=TAB.ID AND \n" +
+            "  SF_COL_IS_IDX_KEY(INDS.KEYNUM, INDS.KEYINFO,COLS.COLID)=1 ORDER BY COLUMN_NAME ASC";
+    }
+
 }

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

@@ -109,7 +109,7 @@ public class DbQueryDecorator extends AbstractDbQuery {
             tableFieldsSql = String.format(tableFieldsSql.replace("#schema", this.schema), tableName, tableName.toUpperCase());
         } else if (DbType.DM == dbType) {
             tableName = tableName.toUpperCase();
-            tableFieldsSql = String.format(tableFieldsSql, tableName, this.schema);
+            tableFieldsSql = String.format(tableFieldsSql, this.schema, tableName);
         } else if (DbType.POSTGRE_SQL == dbType) {
             tableFieldsSql = String.format(tableFieldsSql, tableName, tableName, tableName,this.schema);
         } else {
@@ -164,6 +164,11 @@ public class DbQueryDecorator extends AbstractDbQuery {
         return dbQuery.fieldCustom();
     }
 
+    @Override
+    public String primaryKeySql(DataSourceConfig dataSourceConfig, String tableName) {
+        return dbQuery.primaryKeySql(dataSourceConfig, tableName);
+    }
+
     public Map<String, Object> getCustomFields(ResultSet resultSet) {
         String[] fcs = this.fieldCustom();
         if (null != fcs) {

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

@@ -15,6 +15,8 @@
  */
 package com.baomidou.mybatisplus.generator.config.querys;
 
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
@@ -72,4 +74,10 @@ public class H2Query extends AbstractDbQuery {
     public boolean isKeyIdentity(ResultSet results) throws SQLException {
         return results.getString("SEQUENCE_NAME") != null;
     }
+
+    @Override
+    public String primaryKeySql(DataSourceConfig dataSourceConfig, String tableName) {
+        return String.format(PK_QUERY_SQL, tableName);
+    }
+
 }

+ 7 - 9
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/query/SQLQuery.java

@@ -15,7 +15,6 @@
  */
 package com.baomidou.mybatisplus.generator.query;
 
-import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.generator.config.IDbQuery;
 import com.baomidou.mybatisplus.generator.config.ITypeConvert;
@@ -24,7 +23,6 @@ import com.baomidou.mybatisplus.generator.config.builder.Entity;
 import com.baomidou.mybatisplus.generator.config.po.TableField;
 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import com.baomidou.mybatisplus.generator.config.querys.DbQueryDecorator;
-import com.baomidou.mybatisplus.generator.config.querys.H2Query;
 import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
 import com.baomidou.mybatisplus.generator.jdbc.DatabaseMetaDataWrapper;
 import org.jetbrains.annotations.NotNull;
@@ -93,18 +91,18 @@ public class SQLQuery extends AbstractDatabaseQuery {
     }
 
     protected void convertTableFields(@NotNull TableInfo tableInfo) {
-        DbType dbType = this.dataSourceConfig.getDbType();
         String tableName = tableInfo.getName();
         try {
             Map<String, DatabaseMetaDataWrapper.Column> columnsInfoMap = databaseMetaDataWrapper.getColumnsInfo(tableName, false);
             String tableFieldsSql = dbQuery.tableFieldsSql(tableName);
-            Set<String> h2PkColumns = new HashSet<>();
-            boolean isH2OrLEALONEDbType = (DbType.H2 == dbType || DbType.LEALONE == dbType);
-            if (isH2OrLEALONEDbType) {
-                dbQuery.execute(String.format(H2Query.PK_QUERY_SQL, tableName), result -> {
+            Set<String> pkColumns = new HashSet<>();
+            String primaryKeySql = dbQuery.primaryKeySql(dataSourceConfig, tableName);
+            boolean selectPk = StringUtils.isNotBlank(primaryKeySql);
+            if (selectPk) {
+                dbQuery.execute(primaryKeySql, result -> {
                     String primaryKey = result.getStringResult(dbQuery.fieldKey());
                     if (Boolean.parseBoolean(primaryKey)) {
-                        h2PkColumns.add(result.getStringResult(dbQuery.fieldName()));
+                        pkColumns.add(result.getStringResult(dbQuery.fieldName()));
                     }
                 });
             }
@@ -116,7 +114,7 @@ public class SQLQuery extends AbstractDatabaseQuery {
                 // 设置字段的元数据信息
                 TableField.MetaInfo metaInfo = new TableField.MetaInfo(columnInfo, tableInfo);
                 // 避免多重主键设置,目前只取第一个找到ID,并放到list中的索引为0的位置
-                boolean isId = isH2OrLEALONEDbType ? h2PkColumns.contains(columnName) : result.isPrimaryKey();
+                boolean isId = selectPk ? pkColumns.contains(columnName) : result.isPrimaryKey();
                 // 处理ID
                 if (isId) {
                     field.primaryKey(dbQuery.isKeyIdentity(result.getResultSet()));