springboot集成达梦数据库,取消MySQL数据库,解决问题和冲突

一、驱动与连接配置

  1. 更换JDBC驱动
    在pom.xml中移除MySQL驱动,添加达梦驱动(版本根据DM数据库选择):
java 复制代码
<dependency>
    <groupId>com.dameng</groupId>
    <artifactId>DmJdbcDriver</artifactId>
    <version>8.1.2.141</version> <!-- 按实际版本调整 -->
</dependency>
  1. 修改数据源配置
java 复制代码
#application.yml 中配置达梦连接(注意模式名大小写敏感):
spring:
  datasource:
    driver-class-name: dm.jdbc.driver.DmDriver
    url: jdbc:dm://IP:PORT?schema=MD_TEST  # 显式指定模式
    username: your_user
    password: your_pwd

二、解决SQL语法兼容性问题

  1. 分页查询调整
    问题:MySQL的LIMIT语法在达梦中不兼容。
    方案:配置MyBatis-Plus使用达梦的分页方言
    在配置类中添加:
java 复制代码
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    // 指定达梦数据库类型
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.DM));
    return interceptor;
}
  1. 函数替换

三、替换后启动的出错问题

  1. 在切换到达梦的驱动和数据连接后启动出错,无效的模式名[MD_TEST]
java 复制代码
无效的模式名[MD_TEST]
	at dm.jdbc.driver.DBError.throwException(SourceFile:744)
	at dm.jdbc.a.a.y.r(SourceFile:623)
	at dm.jdbc.a.a.f.r(SourceFile:138)
	at dm.jdbc.a.a.y.z(SourceFile:555)
	at dm.jdbc.a.a.y.L(SourceFile:536)
	at dm.jdbc.a.a.a(SourceFile:267)
	at dm.jdbc.a.a.a(SourceFile:802)
	at dm.jdbc.driver.DmdbStatement.executeInner(SourceFile:771)

问题:找不到在达梦数据库中创建的模式(类型MySQL数据库)

java 复制代码
#在 application.yml 中配置模式名,避免硬编码:
mybatis-plus:
  global-config:
    db-config:
      table-prefix: MD_TEST.  # 末尾的点不能少
      # 或指定schema(根据版本选择)
      schema: MD_TEST
  1. 自定义xml中的sql问题
java 复制代码
### Error querying database.  Cause: dm.jdbc.driver.DMException: 第 2 行, 第 12 列[`]附近出现错误: 
语法分析出错
### The error may exist in file [D:\projectGit\system\target\classes\mybatis\system\MenuMapper.xml]
### The error may involve com.system.dao.MenuDao.listCurrentUserTopMenu
### The error occurred while executing a query
### SQL: select         sm.`menu_id`,sm.`name`         from sys_menu sm         inner join sys_role_menu srm on srm.menu_id = sm.menu_id         inner join sys_user_role sur on sur.role_id = srm.role_id and sur.user_id = ?      order by sm.order_num,sm.menu_id
### Cause: dm.jdbc.driver.DMException: 第 2 行, 第 12 列[`]附近出现错误: 
语法分析出错
; bad SQL grammar []; nested exception is dm.jdbc.driver.DMException: 第 2 行, 第 12 列[`]附近出现错误: 
语法分析出错
org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: dm.jdbc.driver.DMException: 第 2 行, 第 12 列[`]附近出现错误: 
语法分析出错
### The error may exist in file [D:\projectGit\system\target\classes\mybatis\system\MenuMapper.xml]
### The error may involve com.system.dao.MenuDao.listCurrentUserTopMenu
### The error occurred while executing a query
### SQL: select         sm.`menu_id`,sm.`name`         from sys_menu sm         inner join sys_role_menu srm on srm.menu_id = sm.menu_id         inner join sys_user_role sur on sur.role_id = srm.role_id and sur.user_id = ?         where sm.parent_id = 155 and sm.type != 2         order by sm.order_num,sm.menu_id
### Cause: dm.jdbc.driver.DMException: 第 2 行, 第 12 列[`]附近出现错误: 语法分析出错
; bad SQL grammar []; nested exception is dm.jdbc.driver.DMException: 第 2 行, 第 12 列[`]附近出现错误: 语法分析出错

错误原因分析

① 反引号(`)问题:

java 复制代码
sm.`menu_id`, sm.`name`  -- 达梦不支持MySQL的反引号

达梦数据库不支持MySQL的反引号标识符,需要改为双引号或直接去掉,最好是直接取消反引号

② 模式名大小写问题

达梦对大小写敏感,如果迁移时表名/字段名保留了小写,查询时必须用双引号+小写引用。

  1. 模式取名名称出错
java 复制代码
025-07-02 11:40:47.147 [http-nio-12001-exec-2] ERROR c.k.c.e.GlobalExceptionHandler - 【全局异常处理】Exception:
### Error querying database.  Cause: dm.jdbc.driver.DMException: 第 3 行, 第 11 列[-]附近出现错误: 
语法分析出错
### The error may exist in com/system/dao/UserDao.java (best guess)
### The error may involve com.system.dao.UserDao.selectOne
### The error occurred while executing a query
### SQL: SELECT   user_id,username,nickname,photo,mobile,status,client_type,user_type,join_id   FROM MD-TEST.sys_user   WHERE  del_flag=0  AND (user_id = ?)
### Cause: dm.jdbc.driver.DMException: 第 3 行, 第 11 列[-]附近出现错误: 
语法分析出错
; bad SQL grammar []; nested exception is dm.jdbc.driver.DMException: 第 3 行, 第 11 列[-]附近出现错误: 
语法分析出错
org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: dm.jdbc.driver.DMException: 第 3 行, 第 11 列[-]附近出现错误: 
语法分析出错
### The error may exist in com/system/dao/UserDao.java (best guess)
### The error may involve com.system.dao.UserDao.selectOne
### The error occurred while executing a query
### SQL: SELECT   user_id,username,nickname,photo,mobile,status,client_type,user_type,join_id   FROM MD-TEST.sys_user   WHERE  del_flag=0  AND (user_id = ?)
### Cause: dm.jdbc.driver.DMException: 第 3 行, 第 11 列[-]附近出现错误: 
语法分析出错
; bad SQL grammar []; nested exception is dm.jdbc.driver.DMException: 第 3 行, 第 11 列[-]附近出现错误: 

这个错误是由于达梦数据库对标识符(表名、模式名)的命名规则和引用方式与MySQL不同导致的。具体来说,问题出在模式名 MD-TEST 中的连字符 - 上。

1.模式名中的连字符问题:FROM MD-TEST.sys_user 达梦数据库将 MD-TEST 中的 - 解释为减号运算符,而不是模式名的一部分。

2.大小写敏感问题:达梦数据库默认标识符是大小写敏感的,如果创建时使用了小写或混合大小写,必须使用双引号包裹。

  1. 达梦数据库标识符命名规则

① 允许字符:字母(A-Z, a-z)、数字(0-9)、下划线(_)、中文(需要数据库支持中文字符集)

②禁止字符:连字符(-)、空格 、其他特殊字符(@, #, $ 等)

③大小写处理:不加引号的标识符会被转换为大写,包含小写字母或特殊字符的标识符必须用双引号包裹

  1. INFORMATION_SCHEMA 系统视图
java 复制代码
## Error querying database.  Cause: dm.jdbc.driver.DMException: 第1 行附近出现错误:
无效的模式名[INFORMATION_SCHEMA]
### The error may exist in file [D:\projectGit\.system\target\classes\mybatis\share\DataBaseTableDao.xml]
### The error may involve com.share.dao.DataBaseTableDao.exitsTableCreateSql
### The error occurred while executing a query
### SQL: SELECT count(1) FROM information_schema.tables WHERE table_schema=? AND table_name = ?
### Cause: dm.jdbc.driver.DMException: 第1 行附近出现错误:
无效的模式名[INFORMATION_SCHEMA]
; uncategorized SQLException; SQL state [3F000]; error code [-2103]; 第1 行附近出现错误:
无效的模式名[INFORMATION_SCHEMA]; nested exception is dm.jdbc.driver.DMException: 第1 行附近出现错误:
无效的模式名[INFORMATION_SCHEMA]
org.springframework.jdbc.UncategorizedSQLException: 
### Error querying database.  Cause: dm.jdbc.driver.DMException: 第1 行附近出现错误:
无效的模式名[INFORMATION_SCHEMA]

这个错误是因为达梦数据库没有 INFORMATION_SCHEMA 系统视图,这与 MySQL 不同。达梦使用自己的元数据查询方式。

① 达梦数据库的元数据查询:

达梦数据库不使用 INFORMATION_SCHEMA,而是有自己的系统表

达梦的元数据存储在 SYSTABLES、SYSOBJECTS 等系统表中

② 原MySQL查询

java 复制代码
SELECT count(1) 
FROM information_schema.tables 
WHERE table_schema = ? AND table_name = ?

修改后:

java 复制代码
    
    <select id="exitsTableCreateSql" resultType="int">
        SELECT COUNT(1) 
        FROM ALL_TABLES 
        WHERE OWNER = UPPER(#{dataBaseName}) 
        AND TABLE_NAME = UPPER(#{tableName}) #使用 UPPER() 函数确保参数匹配
    </select>
    

如果还需要其他元数据查询,参考达梦官方文档《DM8系统管理员手册》中的"数据字典"章节

相关推荐
liliangcsdn10 小时前
如何使用python创建和维护sqlite3数据库
数据库·sqlite
MC丶科15 小时前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
TDengine (老段)16 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)17 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
@yanyu66617 小时前
idea中配置tomcat
java·mysql·tomcat
安当加密17 小时前
云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
数据库·微服务·云原生
lang2015092817 小时前
Spring Boot 入门:5分钟搭建Hello World
java·spring boot·后端
爱喝白开水a17 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
想ai抽17 小时前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库