MyBatis動態sql之foreach標簽 構建 in 語句


<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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM