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>
MyBatis动态sql之foreach标签 构建 in 语句的更多相关文章
- MyBatis从入门到精通(八):MyBatis动态Sql之foreach标签的用法
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用foreach ...
- mybatis动态sql中foreach标签的使用
foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代.如下: <delete id="deleteBatch"> delete from user w ...
- mybatis动态sql之foreach标签
foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量.它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符.这个元素是很 ...
- MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】
(第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...
- MyBatis动态SQL中trim标签的使用
My Batis 官方文档 对 动态SQL中使用trim标签的场景及效果介绍比较少. 事实上trim标签有点类似于replace效果. trim 属性 prefix:前缀覆盖并增加其内容 suffix ...
- MyBatis动态Sql之if标签的注意事项
if标签的test属性必填,该属性值是一个符合OGNL要求的判断表达式,一般只用true或false作为结果. 判断条件property != null 或 property == null,适用于任 ...
- mybatis动态sql中where标签的使用
where标记的作用类似于动态sql中的set标记,他的作用主要是用来简化sql语句中where条件判断的书写的,如下所示: <select id="selectByParams&qu ...
- Mybatis学习笔记14 - 动态sql之foreach标签
一.查询给定集合中员工id对应的所有员工信息 示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; import ...
- MyBatis从入门到精通(六):MyBatis动态Sql之if标签的用法
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用if标签生成动 ...
- Java EE数据持久化框架 • 【第4章 MyBatis动态SQL】
全部章节 >>>> 本章目录 4.1 MyBatis动态标签 4.1.1 MyBatis动态标签介绍 4.1.2 < if >标签 4.1.3 update语 ...
随机推荐
- vue学习笔记 十八、父子组件相互传递参数
系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...
- 大数据(3)---HDFS客户端命令及java连接
一.参数设置 之前有说到HDFS的备份数量和切块大小都是可以配置的,默认是备份3,切块大小默认128M 文件的切块大小和存储的副本数量,都是由客户端决定! 所谓的由客户端决定,是通过客户端机器上面的配 ...
- 一 , FileChanle
package nio; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer ...
- [转帖]一份完整的阿里云 Redis 开发规范,值得收藏!
https://blog.csdn.net/NicolasLearner/article/details/117449847 作者:付磊-起扬 http://yq.aliyun.com/article ...
- [转帖]使用 Logical Import Mode
https://docs.pingcap.com/zh/tidb/v6.5/tidb-lightning-logical-import-mode-usage 配置及使用 可以通过以下配置文件使用 Lo ...
- [转帖]【JVM】类文件结构
Class文件的定义 一组以8字节为基础单位的二进制流, 各个数据项目严格按照顺序紧凑排列在class文件中, 中间没有任何分隔符,这使得class文件中存储的内容几乎是全部程序运行的程序. 注:Ja ...
- 根目录被赋予777 -R权限后的处理过程
解决某研发手残导致的系统宕机问题的处理过程 背景 2022.8.8 公司一台服务器出现了宕机的现象: 所有的人都无法远程, 都提示密码错误. 但是网络还是通的. 2022.8.12 出差前一天去了一趟 ...
- Mac 版的 Quicker CirMenu
之前在Windows上用过一款圆盘菜单工具Quicker, 感觉非常方便, 换成Macos后,一直没有找到类似应用. 最近终于发现,一款好用的快捷键收集,触发工具CirMenu. 其核心功能是可以根据 ...
- Vue中is属性的用法 可以动态切换组件
is 是组件的一个属性,用来展示组件的名称 is和component联用哈 vue提供了component来展示对应的组件名称 compont是一个占位符,is这个属性,用来展示对应的组件名称 三个子 ...
- golang 中使用 writev (sendmsg) 系统调用来一次发送多块数据
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 writev,或者说 sendmsg 等系统调用,能够发送 ...