SpringBoot RuoYi 达梦数据库整合实战一份完整的application.yml配置清单与SQL改写手册当国产化替代成为技术选型的重要考量达梦数据库作为国产数据库的代表之一正在越来越多地进入企业级应用场景。本文将手把手带你完成SpringBootRuoYi框架与达梦数据库的深度整合从驱动配置到SQL方言适配提供可直接用于生产环境的完整解决方案。1. 环境准备与依赖配置在开始整合前需要确认几个关键环境要素JDK版本达梦7.x推荐使用JDK 1.8SpringBoot版本2.5.x及以上RuoYi版本4.7.5前后端不分离版1.1 Maven依赖配置首先修改项目的pom.xml文件移除MySQL依赖添加达梦官方JDBC驱动。值得注意的是达梦驱动现在已正式入驻Maven中央仓库无需手动安装本地依赖dependency groupIdcom.dameng/groupId artifactIdDm7JdbcDriver18/artifactId version7.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是达梦需要明确指定schemazeroDateTimeBehavior否无需配置与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: countcountSql4. SQL语法适配与改写实战4.1 常见不兼容语法改写REPLACE INTO → MERGE INTORuoYi中记录在线用户功能需要改写!-- 原MySQL语法 -- insert idsaveOnline REPLACE INTO sys_user_online(sessionId, login_name...) VALUES (#{sessionId}, #{loginName}...) /insert !-- 达梦改写后 -- insert idsaveOnline 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...) /insertFIND_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 idinsertUser useGeneratedKeysfalse selectKey keyPropertyuserId resultTypejava.lang.Long orderBEFORE SELECT USER_ID_SEQ.NEXTVAL FROM DUAL /selectKey INSERT INTO sys_user(user_id, ...) VALUES(#{userId}, ...) /insert5. 生产环境注意事项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 MapString, 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?socketTimeout30000connectTimeout5000中文乱码解决方案# 连接字符串追加编码参数 url: jdbc:dm://127.0.0.1:5236/SYSDBA?charsetEncodingUTF-8批量插入优化// 使用达梦特有的批量语法 Update({ BEGIN, INSERT ALL, foreach collectionlist itemitem, INTO table_name(col1,col2) VALUES(#{item.val1},#{item.val2}), /foreach, SELECT 1 FROM DUAL;, END;}) void batchInsert(ListEntity list);经过这些配置和改造后RuoYi系统应该能够稳定运行在达梦数据库上。实际项目中我们还遇到过达梦的CLOB类型处理、索引命名规则差异等问题都需要根据具体业务场景进行调整。