1. 程式人生 > 其它 >達夢資料庫整合流程,mybatis-plus踩坑記錄

達夢資料庫整合流程,mybatis-plus踩坑記錄

達夢資料庫整合流程,mybatis-plus踩坑記錄

從mysql遷移到達夢資料庫可以使用達夢的遷移工具進行遷移,具體可以參考

https://www.cnblogs.com/zywu-king/p/12337382.html 這篇文章;

本次專案使用主要架構為

  • mybatis-plus 3.14
  • 達夢資料庫版本8

資料庫驅動問題

使用資料庫驅動如下

<dependency>
  <groupId>com.dameng</groupId>
  <artifactId>Dm8JdbcDriver18</artifactId>
  <version>8.1.1.49</version>
</dependency>

注意點 : DmJdbcDriver18 這類依賴不能使用,否則mybatis 查詢資料庫會出現型別轉換錯誤;其次 達夢版本為8 就使用 Dm8JdbcDriver18, 如果達夢版本為7 ,就使用 Dm7JdbcDriver17 以此類推;

如果使用 jpa 那麼 達夢8 對應的 hibernate 依賴如下

<dependency>
  <groupId>com.dameng</groupId>
  <artifactId>DmDialect-for-hibernate4.0</artifactId>
  <version>8.1.2.79</version>
</dependency>

附方言配置(按需配置)

#方言
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DmDialect
spring.jpa.database-platform=org.hibernate.dialect.DmDialect
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.show_sql=true

spring配置檔案問題

達夢資料庫類似oracl,其資料庫方式為模式方式。一個模式就是一個數據庫;如果資料庫名稱和模式名稱不一致,那麼使用類似原始的資料庫url 就會出問題, 謹慎起見,url後面都配置模式名稱;

錯誤示範

url: jdbc:dm://localhost:5236/mydb

正確示範

url: jdbc:dm://localhost:5236?schema=mydb

mysql 有 longtext, text blog 等大資料庫型別,遷移到達夢資料庫 一般會轉為clob 型別;查詢時會報型別轉換異常在url後面新增配置,將 clob當作 string處理;

&clobAsString=true

完整的JDBC連線

          url: jdbc:dm://localhost:5236?schema=mydb&compatibleMode=mysql&characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
          username: SYSDBA
          password: mypassword
          driver-class-name: dm.jdbc.driver.DmDriver

activiti支援達夢資料庫

方案一: 尋找已經整合好的jar包 ; 獲取方式 關注gong眾號知識追尋者:回覆 dm 獲取;

方案二: 將activiti-engine-5.22.0相關原始碼拷貝到工程src下,保持包路徑不變,並做相應修改;

具體如下:

  1. 在org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl,增加成員變數
public static final String DATABASE_TYPE_DM = "dm";
public static final String DATABASE_TYPE_H2 = "h2";
public static final String DATABASE_TYPE_HSQL = "hsql";
public static final String DATABASE_TYPE_MYSQL = "mysql";
public static final String DATABASE_TYPE_ORACLE = "oracle";
  1. 在org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl,修改getDefaultDatabaseTypeMappings()
protected static Properties getDefaultDatabaseTypeMappings() {
    Properties databaseTypeMappings = new Properties();
    databaseTypeMappings.setProperty("DM DBMS", DATABASE_TYPE_DM);
    databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2);
  1. 在org.activiti.engine.impl.db.DbSqlSessionFactory,修改initBulkInsertEnabledMap(String databaseType)
if ("oracle".equals(databaseType) || "dm".equals(databaseType)) {
    bulkInsertableMap.put(EventLogEntryEntity.class, Boolean.FALSE);
}
  1. 在org.activiti.engine.impl.db.DbSqlSessionFactory,修改static{}
// dm
databaseSpecificLimitBeforeStatements.put("dm", "");
databaseSpecificLimitAfterStatements.put("dm", "LIMIT #{maxResults} OFFSET #{firstResult}");
databaseSpecificLimitBetweenStatements.put("dm", "");
databaseOuterJoinLimitBetweenStatements.put("dm", "");
databaseSpecificOrderByStatements.put("dm", defaultOrderBy);

// h2
databaseSpecificLimitBeforeStatements.put("h2", "");
databaseSpecificLimitAfterStatements.put("h2", "LIMIT #{maxResults} OFFSET #{firstResult}");
databaseSpecificLimitBetweenStatements.put("h2", "");
databaseOuterJoinLimitBetweenStatements.put("h2", "");
databaseSpecificOrderByStatements.put("h2", defaultOrderBy);
  1. 在 org.activiti.engine.impl.AbstractQuery,修改addOrder(String column, String sortOrder, NullHandlingOnOrder nullHandlingOnOrder)
if (nullHandlingOnOrder.equals(NullHandlingOnOrder.NULLS_FIRST)) {

    if (ProcessEngineConfigurationImpl.DATABASE_TYPE_H2.equals(databaseType) 
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_HSQL.equals(databaseType)
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_POSTGRES.equals(databaseType) 
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_ORACLE.equals(databaseType)
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_DM.equals(databaseType)) {
        orderBy = orderBy + defaultOrderByClause + " NULLS FIRST";
    } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL.equals(databaseType)) {
        orderBy = orderBy + "isnull(" + column + ") desc," + defaultOrderByClause;
    } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_DB2.equals(databaseType) 
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_MSSQL.equals(databaseType)) {
        orderBy = orderBy + "case when " + column + " is null then 0 else 1 end," + defaultOrderByClause;
    } else {
        orderBy = orderBy + defaultOrderByClause;
    }

} else if (nullHandlingOnOrder.equals(NullHandlingOnOrder.NULLS_LAST)) {

    if (ProcessEngineConfigurationImpl.DATABASE_TYPE_H2.equals(databaseType) 
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_HSQL.equals(databaseType)
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_POSTGRES.equals(databaseType) 
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_ORACLE.equals(databaseType)
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_DM.equals(databaseType)) {
        orderBy = orderBy + column + " " + sortOrder + " NULLS LAST";
    } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL.equals(databaseType)) {
        orderBy = orderBy + "isnull(" + column + ") asc," + defaultOrderByClause;
    } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_DB2.equals(databaseType) 
            || ProcessEngineConfigurationImpl.DATABASE_TYPE_MSSQL.equals(databaseType)) {
        orderBy = orderBy + "case when " + column + " is null then 1 else 0 end," + defaultOrderByClause;
    } else {
        orderBy = orderBy + defaultOrderByClause;
    }
}

同時需要引入外部依賴支援流程引擎

  <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.enterprise.concurrent</groupId>
            <artifactId>javax.enterprise.concurrent-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>5.5.0.Final</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>5.5.0.Final</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.uuid</groupId>
            <artifactId>java-uuid-generator</artifactId>
            <version>3.1.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>javax.transaction-api</artifactId>
            <version>1.2</version>
            <scope>provided</scope>
        </dependency>

刪除原始碼 test 包內容;

完成以上重新編譯

資料庫手冊,達夢資料庫連線工具統一關注 gong眾號知識追尋者:回覆 dm 獲取;

參考連線 https://my.oschina.net/168052730/blog/4300003