本文讲述在 RuoYi 框架中整合达梦(DM)数据库的操作,涵盖了从数据库迁移、依赖配置、SQL 函数适配到工具类代码修改的全过程。
首先需要将原有数据库和表迁移到达梦数据库。可以参考达梦官网提供的 MySQL 到 DM 数据迁移文档:https://eco.dameng.com/document/dm/zh-cn/faq/faq-mysql-dm8-migrate.html
了解更多操作细节。
在 ruoyi-admin
模块的 pom.xml
文件中,移除 MySQL 的 JDBC 依赖,并引入达梦的 JDBC 依赖。
具体操作:
1. 找到 <dependencies>
部分。
2. 将 mysql-connector-java
的依赖替换为 Dm8JdbcDriver18
:
<dependencies>
<!-- 其他依赖省略 -->
<!-- MySQL 驱动包(删除) -->
<!--
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
-->
<!-- 达梦驱动包(新增) -->
<dependency>
<groupId>com.dameng</groupId>
<artifactId>Dm8JdbcDriver18</artifactId>
<version>8.1.1.49</version>
</dependency>
</dependencies>
注意:
Dm7JdbcDriver18
中的7
表示 DM 数据库版本,18
表示 JDK 版本。
修改数据库连接的配置文件,确保达梦数据库的相关参数正确。
配置示例:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: dm.jdbc.driver.DmDriver
druid:
# 主库数据源配置
master:
url: jdbc:dm://[ip]:[port]
username: SYSDBA
password: ***
将分页插件 PageHelper
的 helperDialect
设置为 oracle
,以适配达梦数据库的方言。
配置示例:
pagehelper:
helperDialect: oracle
supportMethodsArguments: true
params: count=countSql
达梦数据库不支持部分 MySQL 的 SQL 函数,需进行适配。
replace into
为 merge into
在记录在线用户功能中,SysUserOnlineMapper
的 saveOnline
方法使用了 replace into
,可以改为 merge into
语句:
原代码:
<insert id="saveOnline" parameterType="SysUserOnline">
replace into sys_user_online(sessionId, login_name, dept_name, ipaddr, login_location, browser, os, status, start_timestamp, last_access_time, expire_time)
values (#{sessionId}, #{loginName}, #{deptName}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{status}, #{startTimestamp}, #{lastAccessTime}, #{expireTime})
</insert>
修改后:
<insert id="saveOnline" parameterType="SysUserOnline">
merge into sys_user_online
using (select #{sessionId} sessionId, #{loginName} login_name, #{deptName} dept_name, #{ipaddr} ipaddr, #{loginLocation} login_location, #{browser} browser, #{os} os,
#{status} status, #{startTimestamp} start_timestamp, #{lastAccessTime} last_access_time, #{expireTime} expire_time from dual) d
on sys_user_online.sessionId = d.sessionId
when matched then
update set sys_user_online.login_name = d.login_name, sys_user_online.dept_name = d.dept_name, sys_user_online.ipaddr = d.ipaddr,
sys_user_online.login_location = d.login_location, sys_user_online.browser = d.browser, sys_user_online.os = d.os, sys_user_online.status = d.status,
sys_user_online.start_timestamp = d.start_timestamp, sys_user_online.last_access_time = d.last_access_time, sys_user_online.expire_time = d.expire_time
when not matched then
insert (sessionId, login_name, dept_name, ipaddr, login_location, browser, os, status, start_timestamp, last_access_time, expire_time)
values(d.sessionId, d.login_name, d.dept_name, d.ipaddr, d.login_location, d.browser, d.os, d.status, d.start_timestamp, d.last_access_time, d.expire_time)
</insert>
find_in_set
为 instr
在部门管理的 SysDeptMapper
中,原代码使用了 find_in_set
函数,可替换为 instr
函数:
原代码:
find_in_set(#{deptId}, ancestors)
修改后:
instr(','||ancestors||',' , ','|| #{deptId} ||',')
在 GenTableMapper.xml
中,调整获取表定义信息的查询 SQL:
原代码:
<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>
在 GenTableColumnMapper.xml
中,更新获取列定义信息的 SQL:
原代码:
<select id="selectDbTableColumnsByName" parameterType="String" resultMap="GenTableColumnResult">
select column_name, is_nullable, column_key, ordinal_position, column_comment, extra, column_type
from information_schema.columns where ...
</select>
修改后:
<select id="selectDbTableColumnsByName" parameterType="String" resultMap="GenTableColumnResult">
select sc.NAME column_name, sc.NULLABLE, sc.INFO2, sc.COLID, scc.COMMENT, LOWER(sc.TYPE$) column_type
...
</select>
为适配达梦数据库,需对 GenConstants
和 GenUtils
工具类进行调整。
GenConstants
在 GenConstants.java
中添加对浮点型和整型的判断常量:
public class GenConstants {
...
/** 浮点数 */
public static final String[] COLUMNTYPE_NUMBER_DOUBLE = { "number", "float", "double", "decimal" };
/** 整型 */
public static final String[] COLUMNTYPE_NUMBER_INTEGER = { "tinyint", "smallint", "mediumint", "int", "integer", "bit" };
...
}
GenUtils
在 GenUtils.java
中调整对浮点数和整型数据类型的判断逻辑:
public class GenUtils {
...
public static void initColumnField(GenTableColumn column, GenTable table) {
...
if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) {
column.setHtmlType(GenConstants.HTML_INPUT);
// 浮点型使用 Double
if (arraysContains(GenConstants.COLUMNTYPE_NUMBER_DOUBLE, dataType)) {
column.setJavaType(GenConstants.TYPE_DOUBLE);
}
// 整型
else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER_INTEGER, dataType)) {
column.setJavaType(GenConstants.TYPE_INTEGER);
}
// 长整型
else {
column.setJavaType(GenConstants.TYPE_LONG);
}
}
...
}
}
通过上述步骤,RuoYi 框架即可顺利切换至达梦数据库,确保系统稳定运行。
powered by kaifamiao