<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. Java循环标签

    大家是否见过这种for循环,在for循环前加了个标记的: outerLoop: for (; ; ) { for (; ; ) { break outerLoop; } } 我之前有一次在公司业务代码 ...

  2. 调整PR界面字体大小

    1.问题 界面字体太大或者太小,看得不舒服 2.解决问题 按住ctrl+F12,调出如下工作台 选择Debug Datatbase View 其中找到AdobeCleanFontSize,并修改 重启 ...

  3. 【MicroPython】生成QSTR表 - py\makeqstrdata.py

    转义非字母数字的字符,转义结果为预定义字符串codepoint2name[] def qstr_escape(qst): def esc_char(m): c = ord(m.group(0)) tr ...

  4. 【C++】const 常类型

    常引用 格式:const 类型说明符 &引用名 注意:常引用所引用的对象不能修改 常对象 格式:类名 const 对象名 或 const 类名 对象名 注意:常对象其数据成员在生存期内不能修改 ...

  5. [转帖]小米Redis的K8s容器化部署实践

    https://juejin.cn/post/6844904196924276743     背景 Why K8S How K8s Why Proxy Proxy带来的问题 K8s带来的好处 遇到的问 ...

  6. [转帖]Shell三剑客之awk

    目录 awk简述 awk的工作过程 awk的工作原理 awk的基本格式及其内置变量 getline 文本内容匹配过滤打印 对字段进行处理打印 条件判断打印 awk的三元表达式与精准筛选用法 awk的精 ...

  7. [转帖]MegaRaidCli64 常用命令解释

    MegaRaidCli64 常用命令解释 安装 查看 创建 删除 案例 安装 Centos wget https://docs.broadcom.com/docs-and-downloads/raid ...

  8. [转帖]Springboot容器化镜像设置堆内存大小

    参考资料:Best Practices: Java Memory Arguments for Containers - DZone Java 有三种方式设置最大堆内存大小: 1. -Xmx 2. -X ...

  9. Sysbench 开启超线程/关闭超线程以及容器运行数据库的性能损耗

    Sysbench 开启超线程/关闭超线程性能损耗 摘要 Stress-NG 测试完之后 突然想 使用sysbenchen也进行一次压测 验证一把 超线程对数据的性能影响. 压测命令 ./sysbenc ...

  10. FS OFS RS ORS