我需要通过hashmap中的参数传递数据库名称。
My Mybatis XML
<select id="getById" parameterType="hashmap" resultMap="result">
SELECT * FROM #{db}.CONTACT WHERE CONTACT_NAME = #{name}
</select>
我的Java Call是
hm.put("db","abc");
hm.put("name","def");
Contact c=contactDAO.selectById(hm);
但是我收到以下错误
The error occurred while setting parameters
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your
SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax
to use near ''abc'.CONTACT WHERE CONTACT_NAME = 'def'' at line 1
我们不能将数据库名称作为参数传递给mybatis吗?
答案 0 :(得分:3)
您需要使用${}
代替#{}
进行直接String
替换。
<select id="getById" parameterType="hashmap" resultMap="result">
SELECT * FROM ${db}.CONTACT WHERE CONTACT_NAME = #{name}
</select>
答案 1 :(得分:0)
终于工作了。我所做的改变是
<select id="getById" parameterType="hashmap" resultMap="result">
SELECT * FROM ${db}.CONTACT WHERE CONTACT_NAME = #{name}
</select>
经过一番研究,不同之处在于'#'用于PreparedStatement替换。 '$'用于直接字符串替换。
答案 2 :(得分:0)
如@yalpertem所说(我还不能添加评论):
您需要使用$ {}而不是#{}来直接替换字符串。
但是当数据库以数字开头时会出现问题。 通常,这可以通过在数据库名称上使用“”来解决。
select * from "4dbname".tablename;
或者在MyBatis上;
<select id="getById" parameterType="hashmap" resultMap="result">
SELECT * FROM "${db}".CONTACT WHERE CONTACT_NAME = #{name}
</select>