mybatis提供了用于数组和集合循环遍历的foreach元素。
1.foreach foreach元素常用属性见下表: |属性|含义| |-|-| |item|集合中元素迭代时的别名,该参数为必选。| |index|在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。| |open|foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选。| |separator|元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。| |close|foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。| |collection|要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array将会失效。 |
2.foreach迭代数组
映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.usersMapper">
<!--foreach迭代数组-->
<select id="getUsersByIds" parameterType="java.util.Arrays" resultType="Users">
select * from users where uid in
<foreach collection="array" item="uid" index="index" open="(" separator="," close=")">
#{uid}
</foreach>
</select>
</mapper>
测试类:
@Test
public void testQueryUsersByIds(){
SqlSession session = null;
Integer[] ids = {1,2,4};
try {
session = SqlSessionFactoryUtil.openSqlSession();
List<Users> usersList = session.selectList("getUsersByIds",ids);
usersList.forEach(System.out::println);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
3.foreach迭代List
映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.usersMapper">
<!--foreach迭代List-->
<select id="getUsersByIds" parameterType="java.util.List" resultType="Users">
select * from users where uid in
<foreach collection="list" item="uid" index="index" open="(" separator="," close=")">
#{uid}
</foreach>
</select>
</mapper>
测试类:
@Test
public void testQueryUsersByIds(){
SqlSession session = null;
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(4);
try {
session = SqlSessionFactoryUtil.openSqlSession();
List<Users> usersList = session.selectList("getUsersByIds",list);
usersList.forEach(System.out::println);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
4.foreach迭代Set
映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.usersMapper">
<!--foreach迭代Set-->
<select id="getUsersByIds" parameterType="java.util.Set" resultType="Users">
select * from users where uid in
<foreach collection="collection" item="uid" index="index" open="(" separator="," close=")">
#{uid}
</foreach>
</select>
</mapper>
测试类:
@Test
public void testQueryUsersByIds(){
SqlSession session = null;
Set<Integer> set= new HashSet<Integer>();
set.add(1);
set.add(2);
set.add(4);
try {
session = SqlSessionFactoryUtil.openSqlSession();
List<Users> usersList = session.selectList("getUsersByIds",set);
usersList.forEach(System.out::println);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
5.foreach迭代Map
根据用户类型和用户编号两个查询条件查询用户资料。
映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.usersMapper">
<!--foreach迭代Map-->
<select id="getUsersByTypeAndIds" parameterType="java.util.Map" resultType="Users">
select * from users where type=#{type} and uid in
<foreach collection="ids" item="uid" index="index" open="(" separator="," close=")">
#{uid}
</foreach>
</select>
</mapper>
测试类:
@Test
public void testQueryUsersByTypeAndIds(){
SqlSession session = null;
List<Integer> idList = new ArrayList<Integer>();
idList.add(1);
idList.add(2);
idList.add(4);
Map<String,Object> map = new HashMap<String,Object>();
map.put("type","student");
map.put("ids",idList);
try {
session = SqlSessionFactoryUtil.openSqlSession();
List<Users> usersList = session.selectList("getUsersByTypeAndIds",map);
usersList.forEach(System.out::println);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}