Mybatis之foreach用法----List、Array、Map三种类型遍历
在mybatis的xml文件中构建动态sql语句时,经常会用到标签遍历查询条件。特此记录下不同情况下书写方式!-------仅供大家参考------
1. foreach元素的属性
- collection: 需做foreach(遍历)的对象,作为入参时,list、array对象时,collection属性值分别默认用"list"、"array"代替,Map对象没有默认的属性值。但是,在作为入参时可以使用@Param(“keyName”)注解来设置自定义collection属性值,设置keyName后,list、array会失效;
 - item: 集合元素迭代时的别名称,该参数为必选项;
 - index: 在list、array中,index为元素的序号索引。但是在Map中,index为遍历元素的key值,该参数为可选项;
 - open: 遍历集合时的开始符号,通常与close=")"搭配使用。使用场景IN(),values()时,该参数为可选项;
 - separator: 元素之间的分隔符,类比在IN()的时候,separator=",",最终所有遍历的元素将会以设定的(,)逗号符号隔开,该参数为可选项;
 - close: 遍历集合时的结束符号,通常与open="("搭配使用,该参数为可选项;
 
2.foreach时,collection属性值的三种情况:
- 如果传入的参数类型为List时,collection的默认属性值为list,同样可以使用@Param注解自定义keyName;
 - 如果传入的参数类型为array时,collection的默认属性值为array,同样可以使用@Param注解自定义keyName;
 - 如果传入的参数类型为Map时,collection的属性值可为三种情况:(1.遍历map.keys;2.遍历map.values;3.遍历map.entrySet()),稍后会在代码中示例;
 
3.代码示例:
3.1 collection属性值类型为List:
Mapper接口定义的方法:UserList为模拟返回的数据对象
List<UserList> getUserInfo(@Param("userName") List<String> userName);
Mapper.xml 动态sql构建,Mapper接口的方法名和xml文件的id值,必须一一对应,否则会报错:
-----建议做if test="xxxx !=null and xxxx.size()>0"的校验,比较严谨。array为.length();
 <select id="getUserInfo" resultType="com.test.UserList">
	      SELECT
	        *
	      FROM user_info
	        where
	        <if test="userName!= null and userName.size() >0">
	            USERNAME IN
	            <foreach collection="userName" item="value" separator="," open="(" close=")">
	                #{value}
	            </foreach>
	        </if>
</select>
3.2 collection属性值类型为Array:
Mapper接口定义的方法:UserList为模拟返回的数据对象
List<UserList> getUserInfo(@Param("userName") String[] userName);
Mapper.xml 动态sql构建,Mapper接口的方法名和xml文件的id值,必须一一对应,否则会报错:
-----建议做if test="xxxx !=null and xxxx.length()>0"的校验,比较严谨。
	 <select id="getUserInfo" resultType="com.test.UserList">
	        SELECT
	        	*
	        FROM user_info
	        where
	        <if test="userName!= null and userName.length() >0">
	            USERNAME IN
	            <foreach collection="userName" item="value" separator="," open="(" close=")">
	                #{value}
	            </foreach>
	        </if>
	 </select>
3.3 collection属性值类型为Map:
近期在项目中,遇到这样一个需求,sql查询的条件之一是两个字段确定唯一的一个人,并且条件可能是多个人或者一个人。以往开发中,我们可能遇到只有一个字段的集合或者数组。进入正题:
接收前台传递的List,组装查询条件。其实也可以直接传一个List对象集合,但是实际开发中,List中的每一个对象包含了几十个字段,而我们只需要其中的两个,所以我选择数据组装传递。
实现类处理:
  Map<String, String> patientMap = userList.stream().filter(item -> StringUtils.hasText(item.getUserName()) &&
                    StringUtils.hasText(item.getAge())).collect(Collectors.toMap(UserList::getUserName, UserList::getAge));
Mapper接口定义的方法:UserList为模拟返回的数据对象
List<UserList> getUserInfo(@Param("user") Map<String,String> user);
Mapper.xml 动态sql构建,Mapper接口的方法名和xml文件的id值,必须一一对应,否则会报错:
-----建议做 if test="xxxx !=null and xxxx.size()>0"的校验,比较严谨。
第一种:获取Map的键值对,多字段组合条件情况下,一定要注意书写格式:括号()
eg: SELECT * FROM user_info WHERE (USERNAME,AGE) IN (('张三','26'),('李四','58'),('王五','27'),......);
 <select id="getUserInfo" resultType="com.test.UserList">
	        SELECT
	        	*
	        FROM user_info
	        where
	        <if test="user!= null and user.size() >0">
	            (USERNAME,AGE) IN
	            <foreach collection="user.entrySet()" item="value" index="key" separator="," open="(" close=")">
	                (#{key},#{value})
	            </foreach>
	        </if>
</select>
第二种:参数Map类型,只需要获取key值或者value值
key:
 <select id="getUserInfo" resultType="com.test.UserList">
	        SELECT
	        	*
	        FROM user_info
	        where
	        <if test="user!= null and user.size() >0">
	            (USERNAME) IN
	            <foreach collection="user.keys" item="key"  separator="," open="(" close=")">
	                #{key}
	            </foreach>
	        </if>
</select>
value:
	 <select id="getUserInfo" resultType="com.test.UserList">
	        SELECT
	        	*
	        FROM user_info
	        where
	        <if test="user!= null and user.size() >0">
	            (USERNAME) IN
	            <foreach collection="user.values" item="value"  separator="," open="(" close=")">
	                #{key}
	            </foreach>
	        </if>
</select>
												
											Mybatis之foreach用法----List、Array、Map三种类型遍历的更多相关文章
- Map三种遍历方式
		
Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ...
 - matlab for循环的三种类型
		
学习了一半了,发现一个好网站,就是我想写这篇博客用的,网络真是个好东西!纪念下国庆啦 网址:http://www.yiibai.com/matlab/matlab_for_loop.html ---- ...
 - spring-cloud-square开发实战(三种类型全覆盖)
		
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 前文<五分钟搞懂spring-clou ...
 - 链路层三种类型的MAC地址
		
若需要转载,请注明出处. 我们知道,链路层都是以MAC地址来进行通信双方的地址标识的,如下图:在应用中根据接收方的多寡来进行划分,可分为以下三种: 单播(Unicast) 多播(Multicast) ...
 - C# enum、int、string三种类型互相转换
		
enum.int.string三种类型之间的互转 #代码: public enum Sex { Man=, Woman= } public static void enumConvert() { in ...
 - 缓慢变化维 (Slowly Changing Dimension) 常见的三种类型及原型设计(转)
		
开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库 ...
 - ASP.NET 设计模式分为三种类型
		
设计模式分为三种类型,共23类. 一.创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 二.结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代 ...
 - 云计算服务的三种类型(SaaS、PaaS、IaaS)
		
云计算可以帮助企业降低IT方面的成本和复杂性,并获得他们蓬勃发展所需的灵活性与敏捷性.但是,规划出通往云的明确路径并非易事.毕竟用户需要看透与云相关的市场大肆宣传,然后理解并分析不同种类的云计算模式的 ...
 - OOM三种类型
		
OOM的三种类型: 堆OOM /** * -Xmx1g -XX:+PrintGCDetails -XX:MaxDirectMemorySize=100m * * @param args */ publ ...
 
随机推荐
- 题解【POJ1651】Multiplication Puzzle
			
Description The multiplication puzzle is played with a row of cards, each containing a single positi ...
 - Panda的学习之路(1)——series 和 Dataframe
			
一.Series panda最基本的对象 # pandas的基础s=pd.Series([1,3,6,np.nan,44,1])#建立个简单的基本对象 类似一个一位数组print("建立个简 ...
 - 【音乐欣赏】《Fake》 - The Tech Thieves
			
曲名:Fake 作者:The Tech Thieves [01;12.092]I got wasted,learning how to let it out [01;24.009]Please don ...
 - 分析AppClassLoader,ExtClassLoader 和URLClassLoader 的关系
			
测试代码: class Hello { public String str = "Hello World"; public void fun() { System.out.prin ...
 - JavaScript 推箱子游戏
			
推箱子游戏的 逻辑非常简单,但是如果不动手的话,还是不太清楚.我在这里讲一下自己的思路. 制作推箱子,首先要有自己的设计素材.如下我也是网上找的素材 第二步,理清游戏的规则. 游戏规则: 1.小人将箱 ...
 - qxdm,qpst,qcat抓包分析VoLTE SIP协商包
			
QXDM,QPST和QCAT是Qualcomm高通公司针对高通芯片的抓包分析工具. QXDM抓包分析,QPST与手机com口连接,QCAT用来分析抓包产生的isf文件(log). 使用版本: QXDM ...
 - 通过python代码连接MySQL以及插入和显示数据
			
通过python代码连接MySQL以及插入和显示数据: 数据库huahui创建一个shibie的表,里面有两个varcahr(100)的字段,num和result. import pymysql im ...
 - Linux-VMware 15 虚拟机黑屏问题
			
VMware 15 虚拟机黑屏问题 最近终于舍弃win7,换了win10的操作系统... VM12不兼容,各种问题频出,于是换了VM15. 新装了kali2019.03,结果刚装好不久,在某一 ...
 - Ubuntu mysql 在线安装
			
$ sudo apt install mysql-server
 - codeforces-Three Friends
			
Three Friends Three friends are going to meet each other. Initially, the first friend stays at the ...