<foreach> 元素主要用在構建 in 條件中,它可以在 SQL 語句中迭代一個集合。
<foreach> 元素的屬性主要有 item、index、collection、open、separator、close。
- item 表示集合中每一個元素進行迭代時的別名。
- index 指定一個名字,用於表示在迭代過程中每次迭代到的位置。一般沒什么用。
- open 表示該語句以什么開始。一般沒什么用,還不是直接用 ( 來的方便直接。
- separator 表示在每次進行迭代之間以什么符號作為分隔符。
- close 表示以什么結束。一般沒什么用,還不是直接用 ) 來的方便直接。
在使用 <foreach> 元素時,最關鍵、最容易出錯的是 collection 屬性,該屬性是必選的,但在不同情況下該屬性的值是不一樣的,主要有以下 3 種情況:
- 如果傳入的是單參數且參數類型是一個 List,collection 屬性值為 list。或者直接用 @Param("xxx") ,然后collection的值為:xxx。這種方式更直接,便於理解。
- 如果傳入的是單參數且參數類型是一個 array 數組,collection 的屬性值為 array。或者直接用 @Param("xxx") ,然后collection的值為:xxx。這種方式更直接,便於理解。
- 如果傳入的參數是多個,需要把它們封裝成一個 Map,當然單參數也可以封裝成 Map。Map 的 key 是參數名,collection 屬性值是傳入的 List 或 array 對象在自己封裝的 Map 中的 key。這種做法很愚蠢,還不如直接用 @Param("xxx") ,然后collection的值為:xxx。這種方式更直接,便於理解。
綜上:
1.若是傳array 或 list 單個參數時 ,collection的值可以為:array 或 list 。但是這種做法不便理解,推薦無論是單個參數 還是 多個參數時,只要傳遞 list 和 array 都在參數前 增加:@Param("xxx")。
2.普通的類型的參數前 ,一個參數 或 多個參數 都不需要加@Param,可直接#{xxx}進行使用。
3.經過我的測試,當是一個list參數時 collection的值 可為list
4.經過我的測試,當是一個array參數時,collection的值 可為array
5.當是需要傳遞多個參數時,collection不能為list 和 array了,最好的方法就是在 list 和 array 前面 增加 @Param 來制定名稱,然后collection的值就為這個名稱,這樣最簡單直接方便。
舉例:
mapper.java中的代碼如下:
List<JdpTbTrade> selectListByTids(@Param("tids") String[] tids);
List<JdpTbTrade> selectListByTids(@Param("tids") String[] tids, String abc);
mapper.xml中的代碼如下,collection的值 直接為@Param里的名稱,這樣更直觀:
<select id="selectListByTids" resultType="com.diandaxia.taobao.jdp.entity.JdpTbTrade"> select tid,jdp_response from jdp_tb_trade where tid in ( <foreach collection="tids" item="tid" separator=","> #{tid} </foreach> ) order by created desc </select>
補充 關於 open 和 close 基本無用的問題,以下兩種寫法 效果一樣,您看 哪個最直接,顯然第一種方法 更直接,易於理解:
<select id="selectListByTids" resultType="com.diandaxia.taobao.jdp.entity.JdpTbTrade"> select tid,jdp_response from jdp_tb_trade where tid in ( <foreach collection="tids" item="tid" separator=","> #{tid} </foreach> ) order by created desc </select>
<select id="selectListByTids" resultType="com.diandaxia.taobao.jdp.entity.JdpTbTrade"> select tid,jdp_response from jdp_tb_trade where tid in <foreach collection="tids" item="tid" separator="," open="(" close=")"> #{tid} </foreach> order by created desc </select>
舉例:
mapper.java
/** * 根據shopId列表,批量更新店鋪最近一次登錄時間. */ int updateLastLoginTimeByShopIdAry(@Param("shopIdAry") Integer[] shopIdAry, Date lastLoginTime);
mapper.xml
<update id="updateLastLoginTimeByShopIdAry"> update shop_base set last_login_time = #{lastLoginTime} where shop_id in ( <foreach collection="shopIdAry" item="shopId" separator=","> #{shopId} </foreach> ) </update>