在mybatis中传递数据库名称

时间:2014-12-29 12:37:51

标签: java mysql database mybatis ibatis

我需要通过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吗?

3 个答案:

答案 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>