一、驱动与连接配置
- 更换JDBC驱动
在pom.xml中移除MySQL驱动,添加达梦驱动(版本根据DM数据库选择):
<dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver</artifactId><version>8.1.2.141</version> <!-- 按实际版本调整 -->
</dependency>
- 修改数据源配置
#application.yml 中配置达梦连接(注意模式名大小写敏感):
spring:datasource:driver-class-name: dm.jdbc.driver.DmDriverurl: jdbc:dm://IP:PORT?schema=MD_TEST # 显式指定模式username: your_userpassword: your_pwd
二、解决SQL语法兼容性问题
- 分页查询调整
问题:MySQL的LIMIT语法在达梦中不兼容。
方案:配置MyBatis-Plus使用达梦的分页方言
在配置类中添加:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 指定达梦数据库类型interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.DM));return interceptor;
}
- 函数替换
三、替换后启动的出错问题
- 在切换到达梦的驱动和数据连接后启动出错,无效的模式名[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
- 自定义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的反引号标识符,需要改为双引号或直接去掉,最好是直接取消反引号
② 模式名大小写问题
达梦对大小写敏感,如果迁移时表名/字段名保留了小写,查询时必须用双引号+小写引用。
- 模式取名名称出错
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.大小写敏感问题:达梦数据库默认标识符是大小写敏感的,如果创建时使用了小写或混合大小写,必须使用双引号包裹。
- 达梦数据库标识符命名规则
① 允许字符:字母(A-Z, a-z)、数字(0-9)、下划线(_)、中文(需要数据库支持中文字符集)
②禁止字符:连字符(-)、空格 、其他特殊字符(@, #, $ 等)
③大小写处理:不加引号的标识符会被转换为大写,包含小写字母或特殊字符的标识符必须用双引号包裹
- 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系统管理员手册》中的"数据字典"章节