2013-10-21 111 views
1

我想有一個Oracle12克數據庫使用MyBatis的動態SQL語句,我可以利用哈希表中添加條件語句像下面的內容:動態選擇SQL語句與MyBatis的

<select id="getUsers" resultType="hashmap" parameterType="hashmap"> 
    select * 
    from users 
    <where> 
    <iterate var="i=0" increment> 
    ${columni} like #{valuei} 
    </iterate> 
    </where> 
</select> 

是否有辦法爲了完成這樣的事情?

+0

無法弄清楚 - 你有什麼問題?你讀過mybatis文檔嗎?你的場景看起來很標準和簡單。 –

+0

在文檔中,http://mybatis.github.io/mybatis-3/dynamic-sql.html,您必須通過使用if語句來指定列,而使用foreach的示例僅用於在IN中指定值條件。我想我必須有另一種方式才能完成我想要使用的foreach。同樣我想要的是建立一個select語句,我可以動態地使用列名和值名。 – gabrielarules

+0

問題的答案和它的用法可以在這裏找到: [mybatis-generic-stmt-example](http://stackoverflow.com/a/43356567/2762716) –

回答

2

documentation

字符串替換

缺省情況下,使用#{}語法將導致MyBatis創建預處理語句屬性並以PreparedStatement的參數(例如?)安全地設置的值。雖然這更安全,速度更快且幾乎總是首選,但有時您只是想直接將未修改的字符串注入SQL語句中。例如,對於ORDER BY,你可能會使用這樣的:

ORDER BY ${columnName}

這裏的MyBatis不會修改或轉義字符串。

這使您可以傳遞列名作爲查詢參數等。

記住總是清理您直接粘貼到SQL的數據。


如果你需要生成多個條件爲WHERE條款,使用<where>標籤與<foreach>內。請注意,<foreach>具有允許指定分隔符,開始/結束字符串等的高級屬性。結合前面提到的${}表示法,這允許構建動態WHERE子句。有關示例,請參見this answer

+0

但我如何添加多個where子句?如何迭代地圖來創建where子句?我不想只放一個字符串。 – gabrielarules

+0

爲什麼你不會在''標籤內使用''?看到我更新的答案。 –

+0

謝謝。正是我需要的! – gabrielarules