本文将详细介绍如何将若依分离版集成达梦 DM8 数据库,确保顺利迁移数据、修改配置和执行相关操作。
首先,我们需要将现有的数据库和表迁移至 达梦 DM8 数据库。有关详细的迁移步骤,您可以参考达梦官方文档:
达梦数据库迁移文档:
https://eco.dameng.com/document/dm/zh-cn/faq/faq-mysql-dm8-migrate.html
。
在迁移过程中,如果出现错误提示,例如 “不支持该类型数据” 或者 日期值问题,通常是因为日期格式不兼容。对于这种情况,您需要手动插入无法导入的数据。可以通过以下步骤进行处理:
INSERT
语句手动插入。-- 开启自增列插入
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;
注意: 请确保删除插入语句中的特殊符号,并且在执行之前开启自增列模式。
为确保与达梦 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>
接下来,需要配置数据库连接。请编辑 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
确保 url、username 和 password 与您自己的达梦 DM8 数据库配置相匹配。
由于达梦 DM8 数据库在分页处理上与其他数据库略有不同,我们需要在 ruoyi-admin
模块的 application.yml
文件中进行分页相关的配置修改:
pagehelper:
helperDialect: oracle
supportMethodsArguments: true
params: count=countSql
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;
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>
GenTableMapper.xml
在 ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
文件中,移除原有的 selectDbTableList
、selectDbTableListByNames
和 selectTableByName
,并使用达梦数据库特有的查询语句:
<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>
SysMenuMapper.xml
在 ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
文件中,删除所有多余的符号,确保 SQL 语句格式清晰无误。
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>
在 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;
完成以上步骤后,您就可以成功地将若依分离版与达梦 DM8 数据库集成,实现数据迁移、配置修改和功能扩展。通过这些调整,您将能够充分发挥达梦数据库的性能优势,同时兼容若依框架的各项功能。
powered by kaifamiao