场景再现
在使用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语句中写上具体的数据库名,此时最好是用“,将数据库名引起来,这样就不会出错。因为防止数据库名中出现含有 -中横线的情况。