注意:
你可以传递一个 List 实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称在作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键
public interface EmployeeMapperDynamicSQL {
public List<Employee> getEmpsByConditionForeach(List<Integer> ids); // 使用foreach标签
}
@Test
public void select04() throws IOException { // 测试foreach
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapperDynamicSQL mapper = openSession.getMapper(EmployeeMapperDynamicSQL.class);
List<Employee> list = mapper.getEmpsByConditionForeach(Arrays.asList(1, 3, 5));
for (Employee emp : list) {
System.out.println(emp);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
openSession.close();
}
}
<select id="getEmpsByConditionForeach" resultType="com.mybatis.bean.Employee">
select * from tb1_employee where id in
<!--
collection:指定要遍历的集合
List类型的参数会特殊处理在map中,map的key就叫list
Array数组类型的参数会特殊处理在map中,map的key就叫array
item:将当前遍历的元素赋值给指定的变量
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符
close:遍历出所有结果拼接一个结束的字符
index:索引。遍历list的时候是索引,item就是当前值
遍历map的时候,index是key,item就是map的值
#{变量名}就能取出变量的值,也就是当前遍历出的元素
-->
<foreach collection="aa" item="item" separator="," open="(" close=")" index="index">
#{item}
</foreach>
</select>
解决: 把collection="aa"修改为list,因为mybatis会自动封装在一个map中,而你以集合的方式传参数过去,map会以list作为key,所以将collection="aa"修改为list