63MyBatis - foreach元素(复习)

简介: 63MyBatis - foreach元素(复习)

前面已经讲过:动态SQL的foreach标签

在实际开发中,有时可能会遇到这样的情况:

假设在一个客户表中有1000条数据,现在需要将id值小于100的客户信息全部查询出来,这要怎么做呢?有人也许会说,“我可以一条一条查出来”,那如果查询200、300甚至更多也一条一条查吗?这显然是不可取的。有的人会想到,可以在Java方法中使用循环,将查询方法放在循环语句中,然后通过条件循环的方式查询出所需的数据。这种查询方式虽然可行,但每执行一次循环语句,都需要向数据库中发送一条查询SQL,其查询效率是非常低的。

那么还有其他更好的方法吗?我们能不能通过 SQL 语句来执行这种查询呢?

其实,MyBatis 中已经提供了一种用于数组和集合循环遍历的方式,那就是使用< foreach>元素,我们完全可以通过< foreach>元素来解决上述类似的问题。

代码
<select id="findCustomerByIds" parameterType="List"
        resultType="com.po.Customer">
    select * from t_customer where id in
    <foreach item="id" index="index" collection="list"
             open="(" separator="," close=")">
        #{id}
    </foreach>
</select

在上述代码中,使用了< foreach>元素对传入的集合进行遍历并进行了动态SQL组装。

关于元素中使用的几种属性的描述具体如下:

  • item:配置的是循环中当前的元素。
  • index:配置的是当前元素在集合的位置下标。
  • collection:配置的 list 是传递过来的参数类型(首字母小写),它可以是一个 array、list(或collection)、Map集合的键、POJO包装类中数组或集合类型的属性名等。
  • open和close:配置的是以什么符号将这些集合元素包装起来。
  • separator:配置的是各个元素的间隔符。
测试
/**
     * 根据客户编号批量查询客户信息
     */
    @Test
    public void findCustomerByIdsTest() {
        // 获取SqlSession
        SqlSession session = MybatisUtils.getSession();
        // 创建List集合,封装查询id
        List<Integer> ids = new ArrayList<Integer>();
        ids.add(1);
        ids.add(2);
        // 执行SqlSession的查询方法,返回结果集
        List<Customer> customers = session.selectList("com.itheima.mapper"
                + ".CustomerMapper.findCustomerByIds", ids);
        // 输出查询结果信息
        for (Customer customer : customers) {
            // 打印输出结果
            System.out.println(customer);
        }
        // 关闭SqlSession
        session.close();
    }

效果图:

注意

你可以将任何可迭代对象(如列表、集合等)和任何的字典或者数组对象传递给< foreach>作为集合参数。当使用可迭代对象或者数组时,index 是当前迭代的次数,item 的值是本次迭代获取的元素。当使用字典(或者Map.Entry对象的集合)时,index是键,item是值。

使用< foreach>时最关键也是最容易出错的就是collection属性,该属性是必须指定的,而且在不同情况下,该属性的值是不一样的。主要有以下3种情况:

(1)如果传入的是单参数且参数类型是一个数组或者 List 的时候,collection 属性值分别为array和list(或collection)。

(2)如果传入的参数是多个的时候,就需要把它们封装成一个 Map 了,当然单参数也可以封装成Map集合,这时候collection属性值就为Map的键。

(3)如果传入的参数是POJO包装类的时候,collection属性值就为该包装类中需要进行遍历的数组或集合的属性名。

所以在设置 collection 属性值的时候,必须按照实际情况配置,否则程序就会出现异常。例如,将上述< foreach>元素中collection的属性值设置为array,则程序执行后,将出现如下异常:


目录
相关文章
|
8天前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
SQL Java 数据库连接
MyBatis痛点验证,使用 foreach 批量插入慢?
MyBatis痛点验证,使用 foreach 批量插入慢?
301 0
|
5月前
|
SQL Java 数据库连接
mybatis 中 foreach collection的常用用法
mybatis 中 foreach collection的常用用法
170 1
|
5月前
|
XML Java 数据库连接
MyBatis中批量操作foreach与BatchExecutor使用详解
MyBatis中批量操作foreach与BatchExecutor使用详解
655 0
|
11月前
|
SQL XML Java
Mybatis插入大量数据效率对比:foreach、SqlSession批量、sql
使用mybatis插入数据执行效率对比,对比三种方式(测试数据库为MySQL), 使用 SqlSessionFactory,每一批数据执行一次提交 使用mybatis-plus框架的insert方法,for循环,每次执行一次插入 使用ibatis,纯sql插入
|
12月前
|
SQL 存储 Java
31MyBatis - 动态SQL的 foreach标签
31MyBatis - 动态SQL的 foreach标签
49 0
|
12月前
|
SQL XML Java
mybatis动态sql&choose&foreach&sql 及include & sql中的特殊字符&后台分页实现& 数据版本号处理并发问题
mybatis动态sql&choose&foreach&sql 及include & sql中的特殊字符&后台分页实现& 数据版本号处理并发问题
|
SQL Java 数据库连接
深入解析 MyBatis 中的 <foreach>标签:优雅处理批量操作与动态 SQL
在当今的Java应用程序开发中,数据库操作是一个不可或缺的部分。MyBatis作为一款颇受欢迎的持久层框架,为我们提供了一种优雅而高效的方式来管理数据库操作。在MyBatis的众多特性中,`&lt;foreach&gt;`标签无疑是一个强大的工具,它使得在SQL语句中进行动态循环迭代变得轻而易举。本文将带您深入探索MyBatis中的`&lt;foreach&gt;`标签,揭示其背后的原理和用法。
215 0
java202304java学习笔记第六十六天-ssm-mybatis中dao层实现-动态sql-foreach之1
java202304java学习笔记第六十六天-ssm-mybatis中dao层实现-动态sql-foreach之1
52 0
|
SQL Java 关系型数据库
Mybatis——动态SQL foreach批量操作
Mybatis——动态SQL foreach批量操作
533 0