SpringBoot项目整合达梦数据库(MYSQL 转换 达梦数据库)

avatar
作者
筋斗云
阅读量:0

目录

一、达梦数据库的安装和使用

1、达梦数据库下载

2、Windows环境安装达梦数据库

二、MYSQL数据库 迁移至 达梦数据库

1、DM控制台工具:Console

2、DM数据迁移工具:DTS

三、Spring项目整合达梦数据库

1、配置java项目连接达梦,切换数据连接驱动

2、Maven导入达梦数据库驱动包

3、表的实体类映射。【访问形式:模式名.表名】

4、XML文件:查询表【模式名.表名】

​5、MYSQL字段类型与DM数据类型的转换。【DM:达梦数据库】

6、达梦数据库分页插件

7、SQL适配关键字列名


一、达梦数据库的安装和使用

1、达梦数据库下载

产品下载 | 达梦数据库

2、Windows环境安装达梦数据库

参考文章: Windows环境安装达梦数据库_达梦数据库安装-CSDN博客

二、MYSQL数据库 迁移至 达梦数据库

参考文章:MySQL数据迁移至达梦数据库_mysql迁移达梦-CSDN博客

在安装的tool目录下,查找相关的工具:

1、DM控制台工具:Console

服务器配置又该有两种方式:①DM控制台工具修改;②配置文件修改。

方法一:服务器配置:设置系统兼容性(DM控制台工具),兼容MySQL

方法二:(1)查找dm.ini文件

(2)dm.ini修改【#compatibility】的【COMPATIBLE_MODE】=4

(3)重启Dameng服务

2、DM数据迁移工具:DTS

在这里操作:MYSQL数据库迁移至DM数据库

注意:当迁移过程中出现下面问题时,如有触发器或者外键,需要先关掉触发器和外键,然后进行迁移,不然会导致迁移失败。

MYSQL的数据表转换成DM的数据表时,点击转换按钮。如下:

设置【1:迁移策略选项】

设置【2:列映射选项】

3、添加用户:如果导入的DM数据库需要和MYSQL的用户一样,添加ROOT用户。

三、Spring项目整合达梦数据库

1、配置java项目连接达梦,切换数据连接驱动

2、Maven导入达梦数据库驱动包

3、表的实体类映射。【访问形式:模式名.表名】

4、XML文件:查询表【模式名.表名】

5、MYSQL字段类型与DM数据类型的转换。【DM:达梦数据库】

package com.company.common.core.annotation;  /**  * 数据库类型  *  * @author kally  * @date 2023/12/13  */ public enum DbType {     /**      * 数据库类型(类型,描述)      */     MYSQL("mysql", "MySql数据库"),     MARIADB("mariadb", "MariaDB数据库"),     ORACLE("oracle", "Oracle11g及以下数据库(高版本推荐使用ORACLE_NEW)"),     ORACLE_12C("oracle12c", "Oracle12c+数据库"),     DB2("db2", "DB2数据库"),     H2("h2", "H2数据库"),     HSQL("hsql", "HSQL数据库"),     SQLITE("sqlite", "SQLite数据库"),     POSTGRE_SQL("postgresql", "Postgre数据库"),     SQL_SERVER2005("sqlserver2005", "SQLServer2005数据库"),     SQL_SERVER("sqlserver", "SQLServer数据库"),     DM("dm", "达梦数据库"),     XU_GU("xugu", "虚谷数据库"),     KINGBASE_ES("kingbasees", "人大金仓数据库"),     PHOENIX("phoenix", "Phoenix HBase数据库"),     GAUSS("zenith", "Gauss 数据库"),     CLICK_HOUSE("clickhouse", "clickhouse 数据库"),     GBASE("gbase", "南大通用(华库)数据库"),     GBASE_8S("gbase-8s", "南大通用数据库 GBase 8s"),      @Deprecated     GBASEDBT("gbasedbt", "南大通用数据库"),      @Deprecated     GBASE_INFORMIX("gbase 8s", "南大通用数据库 GBase 8s"),      SINODB("sinodb", "星瑞格数据库"),     OSCAR("oscar", "神通数据库"),     SYBASE("sybase", "Sybase ASE 数据库"),     OCEAN_BASE("oceanbase", "OceanBase 数据库"),     FIREBIRD("Firebird", "Firebird 数据库"),     HIGH_GO("highgo", "瀚高数据库"),     CUBRID("cubrid", "CUBRID数据库"),     GOLDILOCKS("goldilocks", "GOLDILOCKS数据库"),     CSIIDB("csiidb", "CSIIDB数据库"),     SAP_HANA("hana", "SAP_HANA数据库"),     IMPALA("impala", "impala数据库"),     VERTICA("vertica", "vertica数据库"),     XCloud("xcloud", "行云数据库"),     REDSHIFT("redshift", "亚马逊redshift数据库"),     OPENGAUSS("openGauss", "华为 opengauss 数据库"),     TDENGINE("TDengine", "TDengine数据库"),     INFORMIX("informix", "Informix数据库"),     UXDB("uxdb", "优炫数据库"),     LEALONE("lealone", "Lealone数据库"),     OTHER("other", "其他数据库");      private final String db;     private final String desc;      public static DbType getDbType(String dbType) {         DbType[] var1 = values();         int var2 = var1.length;          for (int var3 = 0; var3 < var2; ++var3) {             DbType type = var1[var3];             if (type.db.equalsIgnoreCase(dbType)) {                 return type;             }         }          return OTHER;     }      public String getDb() {         return this.db;     }      public String getDesc() {         return this.desc;     }      /**      * 数据库类型      *      * @param db   数据库      * @param desc 描述      */     private DbType(final String db, final String desc) {         this.db = db;         this.desc = desc;     }  } 

6、达梦数据库分页插件

7、SQL适配关键字列名

mysql使用反引号来区分列名和关键字;达梦数据库使用双引号来区分;实体类映射字段之前的修改。

MybatisPlusConfig.java文件再加入下列代码,复制即可。

@Bean     public DmFieldCustomizer getDmFieldCustomizer() {         return new DmFieldCustomizer();     }      /**      * 在mybatisPlus加载进spring容器之前自定义某些配置      *      * @author HetFrame      */     public static class DmFieldCustomizer implements MybatisPlusPropertiesCustomizer {         public DmFieldCustomizer() {             log.info("加载DmFieldCustomizer...");         }          @SneakyThrows         @Override         public void customize(MybatisPlusProperties properties) {             // 使用达梦数据库             if (Arrays.toString(properties.getMapperLocations()).contains("dm")) {                 log.info("使用达梦数据库");                 //实体类的class                 List<Class<?>> classList = new ArrayList<>();                 PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();                 //找到所有实体类的class                 Resource[] resources = resolver.getResources("classpath*:com/**/entity/**/*.class");                 for (Resource res : resources) {                     // 先获取resource的元信息,然后获取class元信息,最后得到 class 全路径                     String clsName = new SimpleMetadataReaderFactory().getMetadataReader(res).getClassMetadata().getClassName();                     // 通过名称加载                     Class<?> clazz = Class.forName(clsName);                     classList.add(clazz);                 }                  classList.forEach(e -> {                     List<Field> list = TableInfoHelper.getAllFields(e);                     list.forEach(field -> {                         TableField tableField = field.getAnnotation(TableField.class);                         String metaColName;                         if (tableField != null && StringUtils.isNotBlank(metaColName = tableField.value()) && metaColName.contains("`")) {                              String newColName = metaColName.replace("`", "\"");                              InvocationHandler invocationHandler = Proxy.getInvocationHandler(tableField);                             try {                                 Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");                                 memberValues.setAccessible(true);                                 Map memberValuesMap = (Map) memberValues.get(invocationHandler);                                 memberValuesMap.put("value", newColName);                                 log.info("将实体类映射字段{}修改为{}", metaColName, newColName);                             } catch (NoSuchFieldException | IllegalAccessException exception) {                                 throw new RuntimeException(exception);                             }                         }                     });                 });              } else {                 log.info("使用mysql数据库");             }         }     }
package com.company.common.framework.mybatis;   import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;  /**  * MybatisPlusPropertiesCustomizer 用于在读取 properties 之后进行一些自定义操作  *  * @author kally  * @date 2023/12/13  */ public interface MybatisPlusPropertiesCustomizer {     /**      * mysql中我们使用反引号来区分列名和关键字;但在达梦数据库中,使用双引号来区分。      * 而如果创建实体类在注解 @TableField 中使用了反引号例如 @TableField(`range`),      * 这种我们改了的话,mysql 就用不了,不改达梦就用不了。所以从代码入手,在启动时用反射修改值。      * 达梦数据库某些关键字例如 audit,在 mysql 中不是关键字的,需要手动设置 @TableField(`audit`)。      */      /**      * MybatisPlusPropertiesCustomizer 用于在读取 properties 之后进行一些自定义操作      *      * @param properties {@link MybatisPlusProperties}      */     void customize(MybatisPlusProperties properties); }
 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!