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

 更新时间:2025年03月10日 15:41:45   作者:m0_74824496  
这篇文章主要为大家详细介绍了MYSQL转换达梦数据库以及SpringBoot项目整合达梦数据库的相关教程,文中的示例代码讲解详细,需要的可以参考下

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

1、达梦数据库下载

产品下载 | 达梦数据库

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

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

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

参考文章:MySQL数据迁移至达梦数据库

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

1、DM控制台工具:Console

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

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

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

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

(3)重启Dameng服务

2、DM数据迁移工具:DTS

在这里操作:MySQL数据迁移至达梦数据库

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

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);
}

以上就是SpringBoot项目整合达梦数据库详解(MYSQL转换达梦数据库)的详细内容,更多关于SpringBoot整合达梦数据库的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Java中的sleep()和wait()的区别

    详解Java中的sleep()和wait()的区别

    这篇文章主要介绍了详解Java中的sleep()和wait()的区别的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • MyBatis ofType和javaType的区别说明

    MyBatis ofType和javaType的区别说明

    这篇文章主要介绍了MyBatis ofType和javaType的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringBoot整合Jasypt实现配置加密的步骤详解

    SpringBoot整合Jasypt实现配置加密的步骤详解

    Jasypt是一个Java库,提供了一种简单的加密解密方式,可用于保护敏感数据,例如密码、API密钥和数据库连接信息等,本文给大家介绍了SpringBoot整合Jasypt实现配置加密的详细步骤,感兴趣的同学可以参考一下
    2023-11-11
  • SpringCloud Feign超详细讲解

    SpringCloud Feign超详细讲解

    Feign是Netflix公司开发的一个声明式的REST调用客户端; Ribbon负载均衡、 Hystrⅸ服务熔断是我们Spring Cloud中进行微服务开发非常基础的组件,在使用的过程中我们也发现它们一般都是同时出现的,而且配置也都非常相似
    2022-10-10
  • SpringBoot配置GlobalExceptionHandler全局异常处理器案例

    SpringBoot配置GlobalExceptionHandler全局异常处理器案例

    这篇文章主要介绍了SpringBoot配置GlobalExceptionHandler全局异常处理器案例,通过简要的文章说明如何去进行配置以及使用,需要的朋友可以参考下
    2021-06-06
  • 浅谈java封装

    浅谈java封装

    封装封装就是将属性私有化,提供公有的方法访问私有的属性。*实现封装的步骤:(1)修改属性的可见性来限制对属性的访问。(2)为每个属性创建一对赋值方法和取值方法,用于对这些属性的访问。(3)在赋值和取值方法中,加入对属性的存取限制。
    2015-03-03
  • SpringBoot + openFeign实现远程接口调用的过程

    SpringBoot + openFeign实现远程接口调用的过程

    现在的微服务项目不少都使用的是springboot+spring cloud构建的项目,微服务之间的调用都离不开feign来进行远程调用,这篇文章主要介绍了SpringBoot + openFeign实现远程接口调用,需要的朋友可以参考下
    2022-11-11
  • Java线程安全问题小结_动力节点Java学院整理

    Java线程安全问题小结_动力节点Java学院整理

    这篇文章主要介绍了Java线程安全问题小结的相关资料,需要的朋友可以参考下
    2017-05-05
  • JavaWeb简单文件上传流程的实战记录

    JavaWeb简单文件上传流程的实战记录

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,下面这篇文章主要给大家介绍了关于JavaWeb实现简单文件上传流程的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • SpringBoot使用AOP+注解实现简单的权限验证的方法

    SpringBoot使用AOP+注解实现简单的权限验证的方法

    这篇文章主要介绍了SpringBoot使用AOP+注解实现简单的权限验证的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05

最新评论