我想在MyBatis中为Select语句使用String参数。 我的mapper.xml:
<select id="selectAll" parameterType="String" resultMap="fastXMLResultMap">
SELECT CREATIONDATE, DOCUMENTID, TITEL, REGTITEL, INFORCEDATE, DOCTYPE
FROM #{databBaseTable}
</select>
调用函数:
public List<FastXMLObject> selectAll(String databBaseTable) {
SqlSession session = sqlSessionFactory.openSession();
System.out.println("Table: "+databBaseTable);
try {
List<FastXMLObject> list = session.selectList("FastXMLObject.selectAll",databBaseTable);
return list;
} finally {
session.close();
}
}
字符串dataBaseTable是我的数据库表的名称(谁会想到)因为我想从各种表中动态获取数据。
但不幸的是,这不起作用:错误:ORA-00903:UngültigerTabellenname(表名无效)但它不是。当我打印出“databBaseTable”的值时,它就是表的确切名称。当我将表的名称写入我的mapper.xml而没有变量时,它可以工作。 我做错了什么?
答案 0 :(得分:24)
使用${dataBaseTable}
代替'#'。不同之处在于'#'用于PreparedStatement替换。 '$'用于直接字符串替换。
但是,如果执行此操作,则无法将表名作为参数传递给selectList()
调用。您需要将表名称设置为属性。可以使用MyBatis config.xml中的<properties>
元素或使用Configuration.getVariables()
直接在代码中设置属性。
请参阅MyBatis Docs中的“字符串替换”部分。
答案 1 :(得分:7)
好的我绝对不知道为什么会这样,但我只是用以下方法来解决问题:
<select id="selectAll" parameterType="String" resultMap="fastXMLResultMap">
SELECT CREATIONDATE, DOCUMENTID, TITEL, REGTITEL, INFORCEDATE, DOCTYPE
FROM ${value}
</select>
我没有设置任何属性或其他内容,只是从FROM #{databBaseTable}
更改为FROM ${value}
我有人可以回答为什么这项工作会很好。但是现在这对我有帮助。
答案 2 :(得分:3)
使用#{..}语法MyBatis使用jdbc PreparedStatement对象,您无法在该对象上将表名指定为参数。使用#{..},您只能参数化sql语句的参数。
当您使用$ {..}语法时,MyBatis会执行普通的旧字符串替换,因此您可以自由地参数化所需的sql的任何部分。
注意:顺便说一下:使用#{..}你可以非常安全地使用sql注入,但是使用$ {..}它确实为这种攻击打开了大门