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

 

posted on 2020-02-21 19:48  del88  阅读(2444)  评论(0编辑  收藏  举报