10.2 MyBatis动态SQL 10.2.5 foreach标签

10.2 MyBatis动态SQL 10.2.5 foreach标签

关于动态SQL另外一个常用的操作就是需要对一个集合进行遍历,通常发生在构建in条件语句时。

xml映射

1
2
3
4
5
6
7
8
9
10
11
12
13
<select
id="seletEmployeeInIdList"
resultType="domain.Employee">
select * from tb_employee where id in
<foreach
item="item"
index="index"
collection="list"
open="("
separator=","
close=")"> #{item}
</foreach>
</select>

foreach标签的功能非常强大,它允许指定一个集合,声明可以用在标签体内的集合项和索引变量。它也允许指定开闭匹配的字符串以及在迭代中间放置分隔符。这个标签是很智能的,因此它不会随机地附加多余的分隔符。

接口方法

1
List<Employee> seletEmployeeInIdList(List<Integer> ids);

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ForEachTest {
public static void main(String[] args)
{
SqlSession sqlSession = null;
// 1.获取SqlSession实例
sqlSession = SqlSessionFratoryTools.getSqlSession();
// 2.获取mapper接口的代理对象
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2);
ids.add(3);
List<Employee> employees = employeeMapper.seletEmployeeInIdList(ids);
employees.forEach(employee -> System.out.println(" " + employee));
}
}

运行效果

DEBUG [main] ==>  Preparing: SELECT * FROM tb_employee WHERE ID in ( ? , ? , ? ) 
DEBUG [main] ==> Parameters: 1(Integer), 2(Integer), 3(Integer)
DEBUG [main] <==      Total: 3
    Employee [id=1, loginname=xiaoming, password=xiaoming, name=小明, sex=男, age=19, phone=123456789123, sal=9800.0, state=active]
    Employee [id=2, loginname=xiaowang, password=xiaowang, name=小王, sex=男, age=21, phone=123456789123, sal=6800.0, state=active]
    Employee [id=3, loginname=xiaoli, password=xiaoli, name=小丽, sex=女, age=23, phone=123456789123, sal=7800.0, state=active]

可以看到,执行的SQL语句是一个in条件语句,返回的是List集合中的id1,2,3的员工数据。

foreach标签解释

  • 标签属性:
    • collection="list"表示参数类型是List
    • item当前遍历的元素
    • index当前遍历的下标,
      • foreach遍历的数list或者数组时,index代表就是下标,
      • foreach遍历mapindex代表key,此时item表示value
    • open表示前缀,在遍历开始的地方显示该字符
    • separator表示分割符,用于分隔每个元素
    • close表示结束符,遍历结束时显示
  • 标签体:#{item}表示取出当前遍历的元素.

参考链接

https://www.jianshu.com/p/c9c4a2b95400