开发喵星球

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

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

1、数据迁移

迁移过程概述

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

达梦数据库迁移文档:https://eco.dameng.com/document/dm/zh-cn/faq/faq-mysql-dm8-migrate.html

解决迁移问题

在迁移过程中,如果出现错误提示,例如 “不支持该类型数据” 或者 日期值问题,通常是因为日期格式不兼容。对于这种情况,您需要手动插入无法导入的数据。可以通过以下步骤进行处理:

  1. 复制错误数据并使用 INSERT 语句手动插入。
  2. 在执行插入操作时,需要在每个表的插入前后添加以下代码来启用自增列插入:
-- 开启自增列插入
set identity_insert ry.sys_post on; 

-- 插入数据
INSERT INTO ry.sys_post (post_id, post_code, post_name, post_sort, status, create_by, create_time, update_by, update_time, remark) 
VALUES ('1', 'ceo', '董事长', '1', '0', 'admin', '2023-01-12 10:19:54', '', NULL, '');

-- 关闭自增列插入
set identity_insert ry.sys_post off;

注意: 请确保删除插入语句中的特殊符号,并且在执行之前开启自增列模式。

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://127.0.0.1
            username: ry
            password: 123456

确保 urlusernamepassword 与您自己的达梦 DM8 数据库配置相匹配。

4、调整分页配置

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

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

5、实现 find_in_set 函数

在达梦 DM8 中,find_in_set 函数的实现与 MySQL 不同,因此我们需要自定义一个相似的函数。请执行以下 SQL 语句以创建自定义函数:

CREATE OR REPLACE
FUNCTION SYSDBA.FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',')
    RETURN NUMBER IS
    l_idx number := 0;
    str varchar2(500);
    piv_str varchar2(500) := piv_str2;
    res number:=0;
    BEGIN
    IF instr(piv_str, p_sep, 1) = 0 THEN
        IF piv_str = piv_str1 THEN
        res:= 1;
        END IF;
    ELSE
        LOOP
            l_idx := instr(piv_str,p_sep);
            IF l_idx > 0 THEN
                str:= substr(piv_str,1,l_idx- 1);
                IF str = piv_str1 THEN
                    res:= 1;
                    EXIT;
                END IF;
                piv_str := substr(piv_str,l_idx+length(p_sep));
            ELSE
                IF piv_str = piv_str1 THEN
                    res:= 1;
                END IF;
                EXIT;
            END IF;
        END LOOP;
    END IF;
    RETURN res;
END FIND_IN_SET;

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. 修改 GenTableMapper.xml

ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml 文件中,移除原有的 selectDbTableListselectDbTableListByNamesselectTableByName,并使用达梦数据库特有的查询语句:

<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>

3. 修改 SysMenuMapper.xml

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

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 数据库集成,实现数据迁移、配置修改和功能扩展。通过这些调整,您将能够充分发挥达梦数据库的性能优势,同时兼容若依框架的各项功能。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-11-06 10:02:01 阅读量:62
<<   >>


powered by kaifamiao