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

MyBatis动态sql之foreach标签 构建 in 语句的更多相关文章

  1. MyBatis从入门到精通(八):MyBatis动态Sql之foreach标签的用法

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用foreach ...

  2. mybatis动态sql中foreach标签的使用

    foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代.如下: <delete id="deleteBatch"> delete from user w ...

  3. mybatis动态sql之foreach标签

    foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量.它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符.这个元素是很 ...

  4. MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】

    (第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...

  5. MyBatis动态SQL中trim标签的使用

    My Batis 官方文档 对 动态SQL中使用trim标签的场景及效果介绍比较少. 事实上trim标签有点类似于replace效果. trim 属性 prefix:前缀覆盖并增加其内容 suffix ...

  6. MyBatis动态Sql之if标签的注意事项

    if标签的test属性必填,该属性值是一个符合OGNL要求的判断表达式,一般只用true或false作为结果. 判断条件property != null 或 property == null,适用于任 ...

  7. mybatis动态sql中where标签的使用

    where标记的作用类似于动态sql中的set标记,他的作用主要是用来简化sql语句中where条件判断的书写的,如下所示: <select id="selectByParams&qu ...

  8. Mybatis学习笔记14 - 动态sql之foreach标签

    一.查询给定集合中员工id对应的所有员工信息 示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; import ...

  9. MyBatis从入门到精通(六):MyBatis动态Sql之if标签的用法

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用if标签生成动 ...

  10. Java EE数据持久化框架 • 【第4章 MyBatis动态SQL】

    全部章节   >>>> 本章目录 4.1 MyBatis动态标签 4.1.1  MyBatis动态标签介绍 4.1.2 < if >标签 4.1.3 update语 ...

随机推荐

  1. h5响应式方案设计

  2. python之十进制、二进制、八进制、十六进制转换

    数字处理的时候偶尔会遇到一些进制的转换,以下提供一些进制转换的方法 一.十进制转化成二进制 使用bin()函数 1 x=10 2 print(bin(x)) 二.十进制转化为八进制 使用oct()函数 ...

  3. MINGW64 禁用 Bash 路径参数转换

    MINGW64 可以让 Windows 无缝使用 Linux 命令,但是路径参数会被转换为 Windows 风格.例如: $ ./adb shell ls /system ls: C:/Program ...

  4. 每天学五分钟 Liunx 0010 | 软件篇: RPM 和 YUM

    1. RPM RPM(RedHat Package Manager),顾名思义是 RedHat 的软件包管理器.它遵循 GPL 规则且功能强大好用,从而逐渐运用到其它 Liunx 发行版中,包括 Fe ...

  5. SV概述

    System Verilog概述 路科验证视频,B站可看(补充一下知识) 学习SV之前,最好有Verilog基础 SV诞生 SV发展历史 Verilog - 偏向于设计 System Verilog ...

  6. Keep English Level-02

    change -- n 零钱 climate change -- 气候变化 exchange -- 交换,兑换(金融) exchange rate -- 汇率 move -- 感动,改变,移动 (n) ...

  7. FileZilla 连接不上宝塔

    1,修改 pureftp的配置文件 ForcePassiveIP 为服务器的ip , 并去掉 # 2,FileZilla 使用明文连接

  8. unix domain 与本地本地回环在进程间通信中的差异

    前言: 127.0.0.1它是一个私有IP,代表的就是你的本机环回地址,其实本质上是绑定在虚拟网卡loopback上的IP. 在实际应用中,有遇到在使用本地回环做进程间通讯的时候程序阻塞的情况.比如下 ...

  9. [转帖]Linux 上 SQL Server 2022 (16.x) 的各版本和支持的功能

    https://zhuanlan.zhihu.com/p/371869456   本文内容 SQL Server 版本 将 SQL Server 用于客户端/服务器应用程序 SQL Server 组件 ...

  10. [转帖]Oracle性能优化-大内存页配置

    一.为什么需要大页面? 如果您有一个大的RAM和SGA,那么HugePages对于Linux上更快的Oracle数据库性能是至关重要的.如果您的组合数据库SGAs很大(比如超过8GB,甚至对于更小的数 ...