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

发布于:2025-07-03 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、驱动与连接配置

  1. 更换JDBC驱动
    在pom.xml中移除MySQL驱动,添加达梦驱动(版本根据DM数据库选择):
<dependency>
    <groupId>com.dameng</groupId>
    <artifactId>DmJdbcDriver</artifactId>
    <version>8.1.2.141</version> <!-- 按实际版本调整 -->
</dependency>
  1. 修改数据源配置
#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使用达梦的分页方言
    在配置类中添加:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    // 指定达梦数据库类型
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.DM));
    return interceptor;
}
  1. 函数替换
    在这里插入图片描述

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

  1. 在切换到达梦的驱动和数据连接后启动出错,无效的模式名[MD_TEST]
无效的模式名[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数据库)

#在 application.yml 中配置模式名,避免硬编码:
mybatis-plus:
  global-config:
    db-config:
      table-prefix: MD_TEST.  # 末尾的点不能少
      # 或指定schema(根据版本选择)
      schema: MD_TEST
  1. 自定义xml中的sql问题
### 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[`]附近出现错误: 语法分析出错

错误原因分析
① 反引号(`)问题:

sm.`menu_id`, sm.`name`  -- 达梦不支持MySQL的反引号

达梦数据库不支持MySQL的反引号标识符,需要改为双引号或直接去掉,最好是直接取消反引号
② 模式名大小写问题
达梦对大小写敏感,如果迁移时表名/字段名保留了小写,查询时必须用双引号+小写引用。

  1. 模式取名名称出错
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 系统视图
## 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查询

SELECT count(1) 
FROM information_schema.tables 
WHERE table_schema = ? AND table_name = ?

修改后:

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

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


网站公告

今日签到

点亮在社区的每一天
去签到