[英]MyBatis String as Parameter
我想在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是我的數據庫的表的名稱(誰會想到)因為我想從verious表中動態獲取數據。
但不幸的是,這不起作用:錯誤:ORA-00903:UngültigerTabellenname(表名無效)但它不是。 當我打印出“databBaseTable”的值時,它就是表的確切名稱。 當我將表的名稱寫入我的mapper.xml而沒有變量時,它可以工作。 我做錯了什么?
使用${dataBaseTable}
而不是'#'。 不同之處在於'#'用於PreparedStatement替換。 '$'用於直接字符串替換。
但是,如果執行此操作,則無法將表名作為參數傳遞給selectList()
調用。 您需要將表名稱設置為屬性。 可以使用MyBatis config.xml中的<properties>
元素或使用Configuration.getVariables()
直接在代碼中設置<properties>
。
請參閱MyBatis文檔中的“字符串替換”部分。
好吧我絕對不知道為什么會這樣,但我只是使用以下方法來解決問題:
<select id="selectAll" parameterType="String" resultMap="fastXMLResultMap">
SELECT CREATIONDATE, DOCUMENTID, TITEL, REGTITEL, INFORCEDATE, DOCTYPE
FROM ${value}
</select>
我沒有設置任何屬性或其他東西,只是從FROM #{databBaseTable}
更改為FROM ${value}
我有人可以回答為什么這個工作會很好。 但是現在這對我有幫助。
使用#{..}語法,MyBatis使用jdbc PreparedStatement對象,您無法在該對象上將表名指定為參數。 使用#{..},您只能參數化sql語句的參數。
當你使用$ {..}語法MyBatis做普通的舊字符串替換,所以你可以自由地參數化你想要的sql的任何部分。
注意:順便說一下:使用#{..}你可以非常安全地從sql注入,但是使用$ {..}它確實為這種攻擊敞開了大門
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.