SpringBoot + RuoYi + 达梦数据库整合实战:一份完整的application.yml配置清单与SQL改写手册
当国产化替代成为技术选型的重要考量,达梦数据库作为国产数据库的代表之一,正在越来越多地进入企业级应用场景。本文将手把手带你完成SpringBoot+RuoYi框架与达梦数据库的深度整合,从驱动配置到SQL方言适配,提供可直接用于生产环境的完整解决方案。
1. 环境准备与依赖配置
在开始整合前,需要确认几个关键环境要素:
- JDK版本:达梦7.x推荐使用JDK 1.8
- SpringBoot版本:2.5.x及以上
- RuoYi版本:4.7.5(前后端不分离版)
1.1 Maven依赖配置
首先修改项目的pom.xml文件,移除MySQL依赖,添加达梦官方JDBC驱动。值得注意的是,达梦驱动现在已正式入驻Maven中央仓库,无需手动安装本地依赖:
<dependency> <groupId>com.dameng</groupId> <artifactId>Dm7JdbcDriver18</artifactId> <version>7.6.0.165</version> </dependency>驱动命名规则解析:
Dm7:代表达梦数据库主版本号JdbcDriver18:表示兼容JDK 1.8
提示:生产环境建议固定驱动版本号,避免自动升级带来的兼容性问题
2. 数据源与连接池配置
2.1 基础数据源配置
在application.yml中配置Druid连接池与达梦数据库连接参数:
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: dm.jdbc.driver.DmDriver url: jdbc:dm://127.0.0.1:5236/SYSDBA?schema=你的模式名 username: SYSDBA password: DAMENG123 druid: initial-size: 5 min-idle: 5 max-active: 20 max-wait: 60000关键参数说明:
| 参数 | 必填 | 说明 |
|---|---|---|
| schema | 是 | 达梦需要明确指定schema |
| zeroDateTimeBehavior | 否 | 无需配置(与MySQL不同) |
| serverTimezone | 否 | 达梦使用数据库服务器时区 |
2.2 连接池优化建议
针对达梦特性推荐的Druid配置:
druid: validation-query: SELECT 1 FROM DUAL test-while-idle: true test-on-borrow: false test-on-return: false pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 filters: stat,wall3. MyBatis与分页插件配置
3.1 MyBatis适配配置
达梦兼容Oracle语法,需要调整MyBatis配置:
mybatis: mapper-locations: classpath*:mapper/**/*.xml type-aliases-package: com.ruoyi.**.domain configuration: map-underscore-to-camel-case: true default-fetch-size: 100 default-statement-timeout: 303.2 PageHelper分页配置
达梦需要使用Oracle方言:
pagehelper: helper-dialect: oracle reasonable: true support-methods-arguments: true params: count=countSql4. SQL语法适配与改写实战
4.1 常见不兼容语法改写
REPLACE INTO → MERGE INTO
RuoYi中记录在线用户功能需要改写:
<!-- 原MySQL语法 --> <insert id="saveOnline"> REPLACE INTO sys_user_online(sessionId, login_name...) VALUES (#{sessionId}, #{loginName}...) </insert> <!-- 达梦改写后 --> <insert id="saveOnline"> MERGE INTO sys_user_online t USING (SELECT #{sessionId} sessionId... FROM DUAL) s ON (t.sessionId = s.sessionId) WHEN MATCHED THEN UPDATE SET t.login_name = s.login_name... WHEN NOT MATCHED THEN INSERT (sessionId, login_name...) VALUES (s.sessionId, s.login_name...) </insert>FIND_IN_SET → INSTR
部门树查询适配:
-- 原语法 FIND_IN_SET(#{deptId}, ancestors) -- 达梦语法 INSTR(','||ancestors||',', ','||#{deptId}||',') > 04.2 其他常见适配场景
LIMIT语法:
-- MySQL SELECT * FROM table LIMIT 10 -- 达梦 SELECT * FROM table WHERE ROWNUM <= 10日期函数:
-- MySQL DATE_FORMAT(create_time, '%Y-%m-%d') -- 达梦 TO_CHAR(create_time, 'YYYY-MM-DD')自增主键处理:
<insert id="insertUser" useGeneratedKeys="false"> <selectKey keyProperty="userId" resultType="java.lang.Long" order="BEFORE"> SELECT USER_ID_SEQ.NEXTVAL FROM DUAL </selectKey> INSERT INTO sys_user(user_id, ...) VALUES(#{userId}, ...) </insert>
5. 生产环境注意事项
5.1 字符类型处理
达梦的CHAR类型与MySQL有显著差异:
- CHAR(1)实际占用4字节
- 读取时会自动填充空格
- 建议改用VARCHAR2类型
5.2 事务隔离级别
达梦默认使用READ COMMITTED隔离级别,与MySQL的REPEATABLE READ不同,需要注意:
spring: datasource: druid: default-transaction-isolation: 2 # READ_COMMITTED5.3 监控与调优
推荐配置的监控参数:
management: endpoints: web: exposure: include: druid,health,info endpoint: health: show-details: always达梦特有的性能视图查询示例:
-- 查看当前会话 SELECT * FROM V$SESSION; -- 查看锁等待 SELECT * FROM V$LOCK WHERE BLOCK = 1;6. 代码生成器适配
RuoYi的代码生成模块需要特殊处理:
修改数据源查询SQL:
-- 原MySQL表查询 SELECT table_name, table_comment FROM information_schema.tables -- 达梦改写 SELECT TABLE_NAME as table_name, COMMENTS as table_comment FROM ALL_TAB_COMMENTS WHERE OWNER = '你的模式名'列查询语句调整:
SELECT a.COLUMN_NAME as column_name, a.DATA_TYPE as data_type, b.COMMENTS as column_comment FROM ALL_TAB_COLUMNS a LEFT JOIN ALL_COL_COMMENTS b ON a.TABLE_NAME = b.TABLE_NAME AND a.COLUMN_NAME = b.COLUMN_NAME WHERE a.TABLE_NAME = #{tableName}修改
GenTableServiceImpl中的数据库类型判断逻辑:// 将MySQL类型映射改为达梦类型 private static final Map<String, String> JDBC_TYPE_MAP = new HashMap<>(); static { JDBC_TYPE_MAP.put("VARCHAR2", "String"); JDBC_TYPE_MAP.put("NUMBER", "BigDecimal"); // 其他类型映射... }
7. 常见问题排查指南
连接超时问题:
# 增加连接超时参数 url: jdbc:dm://127.0.0.1:5236/SYSDBA?socketTimeout=30000&connectTimeout=5000中文乱码解决方案:
# 连接字符串追加编码参数 url: jdbc:dm://127.0.0.1:5236/SYSDBA?charsetEncoding=UTF-8批量插入优化:
// 使用达梦特有的批量语法 @Update({ "BEGIN", "INSERT ALL", "<foreach collection='list' item='item'>", "INTO table_name(col1,col2) VALUES(#{item.val1},#{item.val2})", "</foreach>", "SELECT 1 FROM DUAL;", "END;"}) void batchInsert(List<Entity> list);经过这些配置和改造后,RuoYi系统应该能够稳定运行在达梦数据库上。实际项目中,我们还遇到过达梦的CLOB类型处理、索引命名规则差异等问题,都需要根据具体业务场景进行调整。