zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    网格形变
    网格简化
    无法打开包括文件: “QWidget”: No such file or directory
    遇到一个 bug svg 抖动的解决方案
    echarts-gl 遇到一个错误 groupGL 未定义
    鼠标操控三维视角
    鼠标控制3维操作 不知道能不能获得一些灵感
    tensorflow 安装
    Codeforces Round #541 (Div. 2) B.Draw!
    Codeforces Round #541 (Div. 2) A.Sea Battle
  • 原文地址:https://www.cnblogs.com/del88/p/12342742.html
Copyright © 2011-2022 走看看