转载:http://blog.sina.com.cn/s/blog_b0d90e8c0102v1q1.html
传参参考:http://www.cnblogs.com/ruiati/p/6410339.html (博主思想很新颖)
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open表示该语句以什么字符串开始,
separator表示在每次进行迭代之间以什么符号作为分隔 符,
close表示以什么字符串结束。
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可
以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key 下面分别来看看上述三种情况的示例代码:
1.单参数List的类型:
<select id="testSelectUsersByIds" parameterType="List" resultMap="UserRoleMap">
select * from t_user where uid in
<foreach item="ids" collection="list" open="(" separator="," close=")">
#{ids}
</foreach>
</select>
ps: 单独传入list时,foreach中的collection必须是list,不不管变量的具体名称是什么。比如这里变量名为idList,
collection却是是list。
MAPPER 代码(相当于DAO接口的一个方法):
List<User> testSelectUsersByIds(List<Integer> ids);
JAVA测试代码:
@Test
public void testSelectUsersByIds() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
List<Integer> ids = new ArrayList<>();
ids.add(2);
ids.add(4);
ids.add(6);
List<User> us = mapper.testSelectUsersByIds(ids);
for(User u: us) {
System.out.println(u.getUname()+", "+u.getUpass()+", "+u.getAge());
//System.out.println(u.getUname()+", "+u.getUpass()+", "+u.getAge()+", "+u.getRole().getRname());
}
} finally {
session.close();
}
}
2. 传入数组
<select id="testSelectUsersByIdsArray" parameterType="ArrayList" resultMap="UserRoleMap">
select * from t_user where uid in
<foreach item="ids" collection="array" open="(" separator="," close=")">
#{ids}
</foreach>
</select>
MAPPER 代码 :
List<User> testSelectUsersByIdsArray(int[] ids); //传入Array数组
JAVA代码:
@Test
public void testSelectUsersByIdsArray() { //传入Array数组
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
int[] ids = new int[] {2,4,6};
List<User> us = mapper.testSelectUsersByIdsArray(ids);
for(User u: us) {
System.out.println(u.getUname()+", "+u.getUpass()+", "+u.getAge());
//System.out.println(u.getUname()+", "+u.getUpass()+", "+u.getAge()+", "+u.getRole().getRname());
}
} finally {
session.close();
}
}
ps: 单独传入数组时,foreach中的collection必须是array,不不管变量的具体名称是什么。比如这里变量名为ids,
collection却是是array
3.自己把参数封装成Map的类型
1 <select id="dynamicForeach3Test" parameterType="java.util.HashMap" resultType="Blog">
2 select * from t_blog where title like "%"#{title}"%" and id in
3 <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
4 #{item}
5 </foreach>
6 </select>
MAPPER:
public List dynamicForeach3Test(Map params);
JAVA 代码:
@Test
public void dynamicForeach3Test() {
SqlSession session = Util.getSqlSessionFactory().openSession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
final List ids = new ArrayList();
ids.add(1);
ids.add(2);
ids.add(3);
ids.add(6);
ids.add(7);
ids.add(9);
Map params = new HashMap();
params.put("ids", ids);
params.put("title", "中国");
List blogs = blogMapper.dynamicForeach3Test(params);
for (Blog blog : blogs)
System.out.println(blog);
session.close();
}
ps: MAP中有list或array时,foreach中的collection必须是具体list或array的变量名。比如这里MAP含有一个
名为idList的list,所以MAP中用idList取值,这点和单独传list或array时不太一样。