我们在使用mybatis循环遍历的时候,经常会用到<foreach>标签,如下:
<foreach collection="array" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
这里面有6个元素,需要注意,分别是:
collection ----> 表示需要迭代的元素类型,很复杂,之后重点说。
item ---> 迭代元素项,随便填,但是要和标签对里面的#{ }变量保持一致即可。
index ---> 索引,随便填
open ---> 开始位置,定死了是“(”。
seprator ---> 分隔符,定死了是","。
close ---> 结束位置,定死了是“)”。
综上所述,我们 最需要关注的是collection这项。根据你的入参又可分为一下若干种情况。
1)array; 2)set; 3)list; 4)map 5)对象,里面包含有array,set,list,map
准备工作:
以下是我数据库测试的表结构:
CREATE TABLE `son` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(50) DEFAULT NULL COMMENT '名称',
`father_id` bigint(20) DEFAULT NULL COMMENT '父亲id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
实体类:
package com.chenjianwen.model;
public class Son {
private Long id;
private String name;
private Long fatherId;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public Long getFatherId() {
return fatherId;
}
public void setFatherId(Long fatherId) {
this.fatherId = fatherId;
}
}
一、array
1)dao层方法:
List<Son> selectUsers(Long[] ids);
2)xml文件查询语句:
注意点总结:
1、parameterType,由于我的dao层方法入参虽是数组,但却是Long类型,所以这里是parameterType = java.lang.Long2.
2、collection,由于这里是数组,所以这里写array
3、这里随便写什么,只要两者保持一致即可
二、set
1)dao层方法:
List<Son> selectUsers(Set<Son> ids);
2)xml文件语句
1、由于dao层入参是Set,所以这里parameterType = java.util.Set
2、collection这里只能是collection,我试过set竟然不行
3、这个随便写,保持一致即可。
三、list
1)dao层方法:
List<Son> selectUsers(List<Son> ids);
2)xml文件语句
1、由于入参是List,所以这里parameterType = java.util.List
2、collection属性是list,当然也可以是collection
3、随便写,保持一致即可。
四、map
Set<Long> idList = new HashSet<>();
idList.add(1L);
idList.add(2L);
idList.add(3L);
idList.add(4L);
idList.add(5L);
Map<String,Object> paraMap = new HashMap<>();
paraMap.put("idMap",idList);
这里现构造一个map的入参,可见是将一个集合(list或set)作为map的value。key值是"idMap";
1)dao层方法
List<Son> selectUsers(Map<String,Object> param);
2)xml文件语句
1、由于dao层方法入参是map,所以这里parameterType = java.util.Map
2、重点注意:这里的collection属性必须是这个map的key值,即为"idMap";
3、还是一样,随便写,保持一致即可。
五、对象中的array
对象中的属性如下所示:
public class SonParam {
private Long[] idArray;
public Long[] getIdArray() {
return idArray;
}
public void setIdArray(Long[] idArray) {
this.idArray = idArray;
}
}
1)dao层方法:
List<Son> selectUsers(SonParam sonParam);
2)xml文件语句
1、入参是对象,所以这里parameterType是该对象的引用路径
2、collection属性,这里注意了,他和该对象SonParam里面变量名保持一致
3、随便写,保持一致即可。
六、对象中的set
对象中的属性如下所示:
public class SonParam {
private Set<Long> idSet;
public Set<Long> getIdSet() {
return idSet;
}
public void setIdSet(Set<Long> idSet) {
this.idSet = idSet;
}
}
1)dao层方法:
List<Son> selectUsers(SonParam sonParam);
2)xml文件语句
1、入参是对象,所以这里parameterType是该对象的引用路径
2、collection属性,这里注意了,他和该对象SonParam里面变量名保持一致
3、随便写,保持一致即可。
七、对象中的list
对象中的属性如下所示:
public class SonParam {
private Set<Long> idList;
public Set<Long> getIdList() {
return idList;
}
public void setIdList(Set<Long> idList) {
this.idList = idList;
}
}
1)dao层方法:
List<Son> selectUsers(SonParam sonParam);
2)xml文件语句
1、入参是对象,所以这里parameterType是该对象的引用路径
2、collection属性,这里注意了,他和该对象SonParam里面变量名保持一致
3、随便写,保持一致即可。
八、对象中的map
对象中的属性如下所示:
public class SonParam {
private Map<String,Object> idMap;
public Map<String, Object> getIdMap() {
return idMap;
}
public void setIdMap(Map<String, Object> idMap) {
this.idMap = idMap;
}
}
给map中添加数据如下:
Set<Long> idList = new HashSet<>()
idList.add(1L);
idList.add(2L);
idList.add(3L);
idList.add(4L);
idList.add(5L);
Map<String,Object> paraMap = new HashMap<>();
paraMap.put("ids",idList);
SonParam param = new SonParam();
param.setIdMap(paraMap);
1)dao层方法:
List<Son> selectUsers(SonParam sonParam);
2)xml文件语句
1、入参是对象,所以这里parameterType是该对象的引用路径
2、collection属性,这里注意了,他是通过对象中的属性idMap点map集合中的key值ids得到的,即为“idMap.ids”;
3、随便写,保持一致即可。
好了,以上即为foreach标签对中属性对于各种集合数据的处理。