簡體   English   中英

MyBatis String作為參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM