mybatis中foreach collection三種用法

閱讀文本大概須要3分鐘。程序員

      在作mybatis的mapper.xml文件的時候,時常遇到一些須要批量操做的狀況,這個時候mybatis的foreach標籤就派上用場了。web

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

  • item:集合中元素迭代時的別名,該參數爲必選。數組

  • index:在list和數組中,index是元素的序號,在map中,index是元素的key,該參數可選微信

  • open:foreach代碼的開始符號,通常是(和close=")"合用。經常使用在in(),values()時。該參數可選mybatis

  • separator:元素之間的分隔符,例如在in()的時候,separator=","會自動在元素中間用「,「隔開,避免手動輸入逗號致使sql錯誤,如in(1,2,)這樣。該參數可選。架構

  • close: foreach代碼的關閉符號,通常是)和open="("合用。經常使用在in(),values()時。該參數可選。app

  • collection: 要作foreach的對象,做爲入參時,List對象默認用"list"代替做爲鍵;數組對象有"array"代替做爲鍵;Map對象沒有默認的鍵。固然在做爲入參時能夠使用@Param("keyName")來設置鍵,設置keyName後,list和array將會失效。除了入參這種狀況外,還有一種做爲參數對象的某個字段的時候。舉個例子:若是User有屬性List ids。入參是User對象,那麼這個collection = "ids"。若是User有屬性Ids ids;其中Ids是個對象,Ids有個屬性List id;入參是User對象,那麼collection = "ids.id"編輯器

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

  • 若是傳入的是單參數且參數類型是一個List的時候,collection屬性值爲list 。

  • 若是傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值爲array 。

  • 若是傳入的參數是多個的時候,就須要把它們封裝成一個Map了,固然單參數也能夠封裝成Map。實際上若是在傳入參數的時候,在MyBatis裏面也是會把它封裝成一個Map的,map的key就是參數名,因此這個時候collection屬性值就是傳入的List或array對象在本身封裝的map裏面的key。


0x01:傳入的參數爲List

 對應的Dao中的Mapper文件是:

public List<User> selectByIds(List<Integer> userIds);

xml文件代碼片斷:

<select id="selectByIds" resultType="com.olive.pojo.User">
        select * from t_user where id in
        <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
</select>

 

0x02: 傳入的參數爲Array

對應的Dao中的Mapper文件是:

public List<User> selectByIds(int[] userIds);

xml文件代碼片斷: 

<select id="selectByIds" resultType="com.olive.pojo.User">
        select * from t_user where id in
        <foreach collection="array" index="index" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>


 0x03: 傳入的參數爲Map

對應的Dao中的Mapper文件是:

public List<User> selectByIds(Map<StringObject> params);

xml文件代碼片斷: 

<select id="selectByIds" resultType="com.olive.pojo.User">
        select * from t_user where  id in
        <foreach collection="userIds" index="index" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>

 Map的時候須要注意的是:collection的值ids是存儲在map中的key,好比:

 map.put("userIds",userIds));

尤爲須要注意;




往期精彩



01 漫談發版哪些事,好課程推薦

02 Linux的經常使用最危險的命令

03 精講Spring&nbsp;Boot—入門+進階+實例

04 優秀的Java程序員必須瞭解的GC哪些

05 互聯網支付系統總體架構詳解

關注我

天天進步一點點

喜歡!在看

本文分享自微信公衆號 - JAVA樂園(happyhuangjinjin88)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索