新项目使用了 RuoYi 框架(前后端不分离版,V4.7.5),且使用达梦数据库。本身 SpringBoot 项目修改数据库不是什么困难的事情,唯一有变数的可能就是国产数据库能查到的资料不是那么丰富;借着本次项目的修改过程,记录成文字,方便以后有迹可循。
一、JDBC 依赖
- 根据以往使用达梦数据库的经验,达梦官方没提供 Maven 版的 jdbc 包,且网上的经验基本也是采用拿达梦数据库安装路径下的 jar 包去安装到本地 Maven 仓库的方式;总觉得本地安装 jar 包或者将 jar 包放入项目资源目录下的方式不爽,然后尝试到 Maven 仓库搜索了一下,居然存在,不确定是不是官方提供的;好吧,有就更方便了;
- 修改 admin 子模块的 pom 文件,将 mysql-jdbc 依赖换成 dm-jdbc 依赖;
- 修改文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<dependencies>
<!-- 其他依赖省略 -->
<!-- Mysql 驱动包 -->
<!-- <dependency>-->
<!-- <groupId>mysql</groupId>-->
<!-- <artifactId>mysql-connector-java</artifactId>-->
<!-- </dependency>-->
<!-- 达梦驱动包 -->
<dependency>
<groupId>com.dameng</groupId>
<artifactId>Dm7JdbcDriver18</artifactId>
<version>7.6.0.165</version>
</dependency>
</dependencies> - 注意 jdbc 包的版本:Dm7JdbcDriver18 中 7 是 DM 数据库的版本,18 是 JDK 版本。
二、数据库连接池配置
- 配置修改如下:
1
2
3
4
5
6
7
8
9
10
11# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: dm.jdbc.driver.DmDriver
druid:
# 主库数据源
master:
url: jdbc:dm://[ip]:[port]
username: SYSDBA
password: ***
三、Pagehelper 方言设置
- 修改如下:
1
2
3
4
5# PageHelper 分页插件
pagehelper:
helperDialect: oracle
supportMethodsArguments: true
params: count=countSql
四、适配 DM 不支持的 SQL 函数
- replace into 函数:记录在线用户功能,SysUserOnlineMapper 里的 saveOnline 方法,用到了不支持的 replace into 函数,需替换成 merge into 函数;
- 原语句:
1
2
3
4<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>- 修改后语句:
1
2
3
4
5
6
7
8
9
10
11
12
13<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,
#{tatus} 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:部门管理,SysDeptMapper 里用到了不支持的 find_in_set 函数,可替换成 instr 函数;
- 示例如下:
1
2
3
4-- 原函数
find_in_set(#{deptId}, ancestors)
-- 新函数
instr(','||ancestors||',' , ','|| #{deptId} ||',')
五、注意事项
- char 类型,长度由 1 变成 4,读出的数据会补空,如‘1 ’,会引起系统显示 / 反填异常;
六、小结
- 至此,整个项目(代码生成模块除外)基本可以正常运行了,项目适配的第一阶段结束;
- sql 函数问题可能存在未发现的,只能遇到再修改;
- 代码生成模块需要读取数据库的表结构等信息,改动较大,暂未进行;需先查找一下 DM 的相关资料,不知道是否可行;如果能够适配的话,会另外记录一篇。
原文链接: https://xinghuipeng.pages.dev/2022/09/22/work/java/RuoYi项目适配达梦数据库(一)/
版权声明: 转载请注明出处.