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 组件 3、父子组件相互访问>
代码结构 一. 01-组件访问-父访问子 1. 效果 点击后在父组件里展示子组件的参数 2.代码 01-组件访问-父访问子.html <!DOCTYPE html> <htm ...
- vue项目部署的最佳实践
前言 使用vue.react.angular等技术开发过程中,我们都会遇到以下问题: 首屏加载慢 每一次更新都需要清除浏览器缓存才能看到效果(经常被测试吐槽) 这两个问题可以从很多方面进行优化,今天我 ...
- uni-app editor富文本编辑器
https://blog.csdn.net/xudejun/article/details/91508189
- P1228-递归【黄】
这道大递归我一开始就找对了方向,不过了MLE,然后从网上搜索到了一个贼有用的概念--尾递归,即如果递归的下一句就是return且没有返回值或者返回值不含有递归函数则编译器会做优化,不会压入新的函数而是 ...
- Laravel - 使用查询构造器查询
public function constructorQuery() { # 1,新增 DB::table('student')->insert([ ...
- [转帖]Strong crypto defaults in RHEL 8 and deprecation of weak crypto algorithms
https://access.redhat.com/articles/3642912 TABLE OF CONTENTS What policies are provided? Removed c ...
- [转帖]linux中的set -e 与set -o pipefail
https://www.cnblogs.com/xingmuxin/p/8431970.html 1.set -e "Exit immediately if a simple command ...
- [转帖]麒麟v10上部署TiDBv5.1.2生产环境的最佳实践
https://tidb.net/book/tidb-monthly/2022/2022-07/usercase/tidb-v5-1-2 前言 笔者最近在一个银行项目中做 PoC 测试,由于客户选择 ...
- [转帖]【InfluxDB V2.0】介绍与使用,flux查询、数据可视化
目录 一.关键概念 二.系统结构 三.配置文件 四.Flux查询语句 五.可视化数据 附录 一.关键概念 相比V1 移除了database 和 RP,增加了bucket. V2具有以下几个概念: ti ...
- SPEC2006的学习与总结
SPEC2006的学习与总结 摘要 最近特别想进行一些性能验证工作. 所以研究了spec2006 然后想整理一下之前的内容. 想着将内容整理一下. 这次主要是抄别人的. 知识来源: https://b ...