Skip to content

若依分离版集成达梦DM8数据库

约 1611 字大约 5 分钟

vueruoyi达梦DM8

2025-10-13

本文将详细介绍如何将若依分离版集成达梦 DM8 数据库,确保顺利迁移数据、修改配置和执行相关操作。

1、数据迁移

迁移过程概述 首先,我们需要将现有的数据库和表迁移至 达梦 DM8 数据库。有关详细的迁移步骤,您可以参考达梦官方文档:达梦数据库迁移文档

或者使用navite 工具进行数据库迁移,如下图配置,有关navicat连接达梦数据库的信息,参考 用Navicat连接达梦数据库MySql迁移到达梦数据库1MySql迁移到达梦数据库2

注意事项 迁移成功后,mysql中原有的自增字段设置,在达梦中无效,需要执行如下脚本:RYDB指的是达梦中的模式名

ALTER TABLE "RYDB"."SYS_CONFIG" ADD COLUMN "CONFIG_ID" IDENTITY(1, 1);
ALTER TABLE "RYDB"."SYS_DEPT" ADD COLUMN "DEPT_ID" IDENTITY(1, 1);
ALTER TABLE "RYDB"."SYS_DICT_DATA" ADD COLUMN "DICT_CODE" IDENTITY(1, 1);
ALTER TABLE "RYDB"."SYS_DICT_TYPE" ADD COLUMN "DICT_ID" IDENTITY(1, 1);
ALTER TABLE "RYDB"."SYS_JOB" ADD COLUMN "JOB_ID" IDENTITY(1, 1);
ALTER TABLE "RYDB"."SYS_JOB_LOG" ADD COLUMN "JOB_LOG_ID" IDENTITY(1, 1);
ALTER TABLE "RYDB"."SYS_LOGININFOR" ADD COLUMN "INFO_ID" IDENTITY(1, 1);
ALTER TABLE "RYDB"."SYS_MENU" ADD COLUMN "MENU_ID" IDENTITY(1, 1);
ALTER TABLE "RYDB"."SYS_NOTICE" ADD COLUMN "NOTICE_ID" IDENTITY(1, 1);
ALTER TABLE "RYDB"."SYS_OPER_LOG" ADD COLUMN "OPER_ID" IDENTITY(1, 1);
ALTER TABLE "RYDB"."SYS_POST" ADD COLUMN "POST_ID" IDENTITY(1, 1);
ALTER TABLE "RYDB"."SYS_ROLE" ADD COLUMN "ROLE_ID" IDENTITY(1, 1);
ALTER TABLE "RYDB"."SYS_USER" ADD COLUMN "USER_ID" IDENTITY(1, 1);

如果你还有其他业务表需要处理,可使用以下脚本,来获取表名,以及第一个字段名,做相应的处理:

SELECT TABLE_NAME, COLUMN_NAME --, DATA_TYPE
FROM (
	SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE,ROW_NUMBER() OVER (PARTITION BY TABLE_NAME ORDER BY COLUMN_ID) AS rn
    FROM ALL_TAB_COLUMNS
	WHERE OWNER = 'RYDB' 
	AND TABLE_NAME NOT IN ('SYS_ROLE_DEPT','SYS_ROLE_MENU','SYS_USER_CONTRACT','SYS_USER_POST','SYS_USER_ROLE')
) 
WHERE rn = 1;

2、添加依赖

为确保与达梦 DM8 数据库的兼容性,您需要在 ruoyi-admin 模块的 pom.xml 文件中添加以下两个依赖:

<!-- 达梦数据库 JDBC 驱动 -->
<dependency>
    <groupId>com.dameng</groupId>
    <artifactId>Dm8JdbcDriver18</artifactId>
    <version>8.1.1.49</version>
</dependency>

<!-- 达梦数据库 Hibernate 方言 -->
<dependency>
    <groupId>com.dameng</groupId>
    <artifactId>DmDialect-for-hibernate5.3</artifactId>
    <version>8.1.1.49</version>
</dependency>

3、修改数据库配置

接下来,需要配置数据库连接。请编辑 ruoyi-admin 模块下的 application-druid.yml 文件,修改以下配置:

datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: dm.jdbc.driver.DmDriver
    druid:
        master:
            url: jdbc:dm://192.168.100.100:5236?SCHEMA=SYSDBA
            username: ry
            password: 123456

确保 url、username 和 password 与您自己的达梦 DM8 数据库配置相匹配。

4、调整分页配置

由于达梦 DM8 数据库在分页处理上与其他数据库略有不同,我们需要在 ruoyi-admin 模块的 application.yml 文件中进行分页相关的配置修改:

pagehelper:
  helperDialect: oracle
  supportMethodsArguments: true
  params: count=countSql

5、实现 find_in_set 函数

在达梦 DM8 中,find_in_set 函数的实现与 MySQL 不同,在部门管理的 ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml 中,原代码使用了 find_in_set 函数,可替换为 instr 函数: 原代码:

find_in_set(#{deptId}, ancestors)

修改后:

instr(','||ancestors||',' , ','|| #{deptId} ||',')

6、修改 Mapper 文件

1. 修改 sysNoticeMapper.xml

在 ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml 文件中,将 cast() 函数替换为 to_char(),以确保与达梦 DM8 的兼容性:

<sql id="selectNoticeVo">
    select notice_id, notice_title, notice_type, to_char(notice_content) as notice_content, status, create_by, create_time, update_by, update_time, remark
    from sys_notice
</sql>

2. 修改 SysMenuMapper.xml,以及其他mapper.xml文件中包含有 ` 的符号

在 ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml 文件中,删除所有多余的符号(比如 ` ),确保 SQL 语句格式清晰无误。

注意:若开发环境不使用达梦,则以下步骤可以忽略

3. 修改 GenTableMapper.xml

在 ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml 文件中: 原代码:

<select id="selectDbTableList" parameterType="GenTable" resultMap="GenTableResult">
    select table_name, table_comment, create_time, update_time from information_schema.tables
    where table_schema = (select database())
    ...
</select>

修改后:

<select id="selectDbTableList" parameterType="GenTable" resultMap="GenTableResult">
    select so.NAME table_name, st.COMMENT$ table_comment, so.CRTDATE create_time from SYS.SYSOBJECTS so 
    ...
</select>

<sql id="selectDamengTableVo">
    select
        a.*,
        b.commentas table_comment
    from
        (
            select
                SF_GET_SCHEMA_NAME_BY_ID(SCHID) AS schema_name,
                name as table_name,
                crtdate as create_time
            from
                sys.sysobjects
            where
                type = 'SCHOBJ'
                and subType$ = 'UTAB'
                and schid = CURRENT_SCHID
        ) a
    left join
        sys.systablecomments b on a.schema_name = b.schname and a.table_name = b.tvname and b.table_type = 'TABLE'
</sql>

<!-- 查询数据库表列表 -->
<select id="selectDbTableList" parameterType="GenTable" resultMap="GenTableResult">
    <include refid="selectDamengTableVo"></include>
    <where>
        a.table_name NOT LIKE 'QRTZ_%' AND a.table_name NOT LIKE 'GEN_%'
        AND a.table_name NOT IN (select table_name from gen_table)
        <if test="tableSchema != null and tableSchema != ''">
            AND lower(a.table_schema) like lower(concat('%', #{tableSchema}, '%'))
        </if>
        <if test="tableName != null and tableName != ''">
            AND lower(a.table_name) like lower(concat('%', #{tableName}, '%'))
        </if>
    </where>
    order by create_time desc
</select>

4. 修改 GenTableColumnMapper.xml

在 ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml 文件中,修改模式名为您的实际模式名:

<select id="selectDbTableColumnsByName" parameterType="String" resultMap="GenTableColumnResult">
  select
        sc.NAME column_name,
        (case when sc.INFO2 = 1 then '1' else '0'  end) is_pk,
        sc.COLID sort, scc.COMMENTcolumn_comment,
        (case when sc.INFO2 = 1 then '1' else '0' end) as is_increment,
        sc.TYPE column_type
  from
        sys.syscolumns sc
    left join
        SYS.SYSOBJECTS so on sc.ID = so.ID
    left join SYS.SYSCOLUMNCOMMENTS SCC on sc.NAME = scc.COLNAME and scc.TABLE_TYPE = 'TABLE' and scc.SCHNAME = your_schema_name and scc.TVNAME= so.NAME
  where
        so.TYPE='SCHOBJ' and so.SUBTYPE='UTAB' and so.PID = -1
        and SF_GET_SCHEMA_NAME_BY_ID(so.SCHID) = your_schema_name
        and so.NAME = #{tableName}
</select>

7、生成 SQL 脚本

在 ruoyi-generator/src/main/resources/vm/sql/sql.vm 文件中,确保生成的 SQL 脚本符合达梦数据库的格式要求。例如,生成菜单 SQL 的代码:

-- 菜单 SQL
insert into {tableSchema}.sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('{functionName}', '{parentMenuId}', '1', '{businessName}', '{moduleName}/{businessName}/index', 1, 0, 'C', '0', '0', '{permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '{functionName}菜单');

DECLARE
-- 按钮父菜单ID
parentId BIGINT := @@IDENTITY;

BEGIN
-- 按钮 SQL
insert into {tableSchema}.sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('{functionName}查询', parentId, '1',  '#', '', 1, 0, 'F', '0', '0', '{permissionPrefix}:query','#', 'admin', sysdate(), '', null, '');

insert into{tableSchema}.sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('{functionName}新增', parentId, '2',  '#', '', 1, 0, 'F', '0', '0', '{permissionPrefix}:add','#', 'admin', sysdate(), '', null, '');

insert into {tableSchema}.sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('{functionName}修改', parentId, '3',  '#', '', 1, 0, 'F', '0', '0', '{permissionPrefix}:edit','#', 'admin', sysdate(), '', null, '');

insert into{tableSchema}.sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('{functionName}删除', parentId, '4',  '#', '', 1, 0, 'F', '0', '0', '{permissionPrefix}:remove','#', 'admin', sysdate(), '', null, '');

insert into {tableSchema}.sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('{functionName}导出', parentId, '5',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export','#', 'admin', sysdate(), '', null, '');
END;

8、总结

完成以上步骤后,您就可以成功地将若依分离版与达梦 DM8 数据库集成,实现数据迁移、配置修改和功能扩展。通过这些调整,您将能够充分发挥达梦数据库的性能优势,同时兼容若依框架的各项功能。

参考:

联系我们(微信)