mybatis 中 foreach collection的三種用法

foreach元素的屬性主要有 item,index,collection,open,separator,close。

    item:表示集合中每一個元素進行迭代時的別名,
    index:指 定一個名字,用於表示在迭代過程中,每次迭代到的位置,
    separator:表示在每次進行迭代之間以什麼符號作爲分隔符,
    open:表示該語句以什麼開始,
    close:表示以什麼結束。


在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:

    1. 如果傳入的是單參數且參數類型是一個List的時候,collection屬性值爲list

    2. 如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值爲array

    3. 如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,實際上如果你在傳入參數的時候,在breast裏面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map裏面的key 

         而有些時候,我們看到的不是這三種,collection的屬性值而是直接引用註解中的參數名字,這樣mybatis會忽略類型,按名字引入。這個時候要使用@param:

public User queryUserByParams(@Param("id") Integer id, @Param("userName") String userName);

代碼演示:

1. 當查詢的參數只有一個時 
  findByIds(List<Long> ids)
 1.a 如果參數的類型是List, 則在使用時,collection屬性要必須指定爲 list
 <select id="findByIdsMap" resultMap="BaseResultMap">
         Select
         <include refid="Base_Column_List" />
         from jria where ID in
                  <foreach item="item" index="index" collection="list" 
                         open="(" separator="," close=")">
                        #{item}
                </foreach>
  </select> 

 
 findByIds(Long[] ids)
 1.b 如果參數的類型是Array,則在使用時,collection屬性要必須指定爲 array
  <select id="findByIdsMap" resultMap="BaseResultMap">
                 select
                 <include refid="Base_Column_List" />
          from jria where ID in
                  <foreach item="item" index="index" collection="array" 
                         open="(" separator="," close=")">
                        #{item}
                </foreach>
  </select> 

 
2. 當查詢的參數有多個時,例如 findByIds(String name, Long[] ids)
 這種情況需要特別注意,在傳參數時,一定要改用Map方式, 這樣在collection屬性可以指定名稱
         下面是一個示例
         Map<String, Object> params = new HashMap<String, Object>(2);
        params.put("name", name);
         params.put("ids", ids);
        mapper.findByIdsMap(params);

 
 <select id="findByIdsMap" resultMap="BaseResultMap">
                 select
                 <include refid="Base_Column_List" />
          from jria where ID in
                  <foreach item="item" index="index" collection="ids" 
                         open="(" separator="," close=")">
                        #{item}
                </foreach>
   </select> 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章