共计 1219 个字符,预计需要花费 4 分钟才能阅读完成。
场景再现
在使用 mybatis 查询 mysql 数据库时,想实现动态的 传 数据库名,发现出现了报错,具体报错信息如下:
### SQL: SELECT * FROM hidbm-vue.`db_sql_explan_info`
### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-vue.`db_sql_explan_info`' at line 1
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-vue.`db_sql_explan_info`' at line 1
很奇怪,为什么这样写不可以查询?
问题排查
检查一下 mybatis 的语句写的是否正确,xml 文件如下:
select id="getAllMagicAssets" parameterType="String" resultType="java.util.Map">
SELECT * FROM ${dbName}.`db_sql_explan_info`
/select>
其中 ${dbName} 就是动态的数据库名,可能有的同学会问 为什么要使用 $ 而不是 #?是因为使用#{dbName},这样传过来的值会带有单引号,会造成语法错误,可以看一下拼接出来的 sql 是这样的:
SELECT * FROM 'hidbm-vue'.`db_sql_explan_info`
下面是执行这条 sql 的报错信息:
好了,那么问题究竟出在哪里呢?
解决方案
其实问题还是出在 xml 配置文件,一般情况下,这种写法是没问题的,
SELECT * FROM ${dbName}.`db_sql_explan_info`
但是,如果你遇到的数据库名出现 中横线,比如 hidbm-vue,这个时候,需要将动态的参数用 “ 这个符号引起来,否则会报错的。sql 语句要这样写
SELECT * FROM `${dbName}`.`db_sql_explan_info`
总结
当使用 mybatis 查询数据库时,如果你想在 sql 语句中写上具体的数据库名,此时最好是用 “,将数据库名引起来,这样就不会出错。因为防止数据库名中出现含有 - 中横线的情况。
原文地址: mybatis 查询报错:your MariaDB server version for the right syntax to use near‘-vue.`db_sql_explan_info`‘
正文完