2013-02-11 107 views
1

我想知道在彈簧集成中使用mybatis時,變換方法參數的最佳方法是什麼。轉換的原因可能是由於各種原因 - 例如, mybatis無法處理java.util.Set作爲參數輸入。Mybatis彈簧變換參數

具體,說我有一個DAO接口方法爲:

List<Foo> getFooForUniqueIds(Set<Long> ids); 

和相應的XML爲:

<select id="getFooForUniqueIds" parameterType="java.util.Set" resultMap="foo"> 
    SELECT f.* 
     FROM foo f 
    WHERE f.id IN <foreach collection="list" item="item" separator="," close=")" open="("> 
      #{item} 
      </foreach> 
</select> 

我需要一種方法來Set<Long> ids轉變成List<Long> ids的MyBatis的XML片段可以解釋。我明白我們可以給出一個直接處理SqlSessionFactory的具體類,但我喜歡Spring集成提供的抽象,我不擔心獲取會話和關閉它們等非有趣的東西。

有人可能會認爲DAO應該是愚蠢的,可能應該在服務層進行轉換。然而,這種情況下的轉換是因爲mapper框架的細微差別,服務層做了一些抵消它的工作似乎不正確。

歡迎提出建議,並提前致謝!

回答

1

這裏的具體示例可以通過@Param提供一個param名稱(而不是假設它是「list」)並在XML中使用該param名稱來解決。

List<Foo> getFooForUniqueIds(@Param("set") Set<Long> ids); 

與XML作爲

<select id="getFooForUniqueIds" parameterType="java.util.Set" resultMap="foo"> 
SELECT f.* 
    FROM foo f 
WHERE f.id IN <foreach collection="set" item="item" separator="," close=")" open="("> 
     #{item} 
     </foreach> 
</select> 

參考: https://groups.google.com/forum/?fromgroups=#!topic/mybatis-user/BGjvVw1xx_c

0

你可以看看MyBatis typeHandlers。 創建你自己的類型處理程序並在你的parameterMap中定義它 - 這可以做一個竅門。

的MyBatis只接受列表和數組類型的foreach語句:

你可以傳遞一個List實例或者數組的MyBatis作爲一個參數 對象。當你這樣做的時候,MyBatis會自動將它包裝在一個Map中,並且按名稱來鍵入它。列表實例將被鍵入名稱「列表」,並將數組實例鍵入名稱「數組」。