foreach一共有三种类型,分别为List,[](array),Map三种。
foreach的第一篇用来将List和数组(array)。
下面表格是我总结的各个属性的用途和注意点。
foreach属性
item | 循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。 具体说明:在list和数组中是其中的对象,在map中是value。 该参数为必选。 |
collection | 要做foreach的对象,作为入参时,List<?>对象默认用list代替作为键,数组对象有array代替作为键,Map对象用map代替作为键。 当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array,map将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子: 如果User有属性List ids。入参是User对象,那么这个collection = "ids" 如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = "ids.id" 上面只是举例,具体collection等于什么,就看你想对那个元素做循环。 该参数为必选。 |
separator | 元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。 |
open | foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选。 |
close | foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。 |
index | 在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。 |
下面是测试。
SQL
- drop table users if exists;
- create table users (
- id int,
- name varchar(20)
- );
- insert into users (id, name) values(1, 'User1');
- insert into users (id, name) values(2, 'User2');
- insert into users (id, name) values(3, 'User3');
- insert into users (id, name) values(4, 'User4');
- insert into users (id, name) values(5, 'User5');
- insert into users (id, name) values(6, 'User6');
User类
Mapper.xml
- <select id="countByUserList" resultType="_int" parameterType="list">
- select count(*) from users
- <where>
- id in
- <foreach item="item" collection="list" separator="," open="(" close=")" index="">
- #{item.id, jdbcType=NUMERIC}
- </foreach>
- </where>
- </select>
测试代码:
- @Test
- public void shouldHandleComplexNullItem() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- Mapper mapper = sqlSession.getMapper(Mapper.class);
- User user1 = new User();
- user1.setId(2);
- user1.setName("User2");
- List<User> users = new ArrayList<User>();
- users.add(user1);
- users.add(null);
- int count = mapper.countByUserList(users);
- Assert.assertEquals(1, count);
- } finally {
- sqlSession.close();
- }
- }
测试日志:
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Setting autocommit to false on JDBC Connection [org.hsqldb.jdbc.JDBCConnection@4b83b34e]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [org.hsqldb.jdbc.JDBCConnection@4b83b34e]
DEBUG [main] - Closing JDBC Connection [org.hsqldb.jdbc.JDBCConnection@4b83b34e]
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Setting autocommit to false on JDBC Connection [org.hsqldb.jdbc.JDBCConnection@763d1932]
DEBUG [main] - ==> Preparing: select count(*) from users WHERE id in ( ? , ? )
DEBUG [main] - ==> Parameters: 2(Integer), null
DEBUG [main] - <== Total: 1
DEBUG [main] - Resetting autocommit to true on JDBC Connection [org.hsqldb.jdbc.JDBCConnection@763d1932]
DEBUG [main] - Closing JDBC Connection [org.hsqldb.jdbc.JDBCConnection@763d1932]
上面这个例子是List的,但是和数组的情况基本一样,所以不针对数组进行测试了。可以看到这个例子的内容是很简单的,实际上List,array,map也可以互相嵌套,可以用多个foreach去执行,如果想看这样一个例子,可以移步这里:
上面这个问题就遇到了list,map一起用的问题,3楼是问题的答案,可以参考一看。
由于map的key,value比较特殊,所以下次再说。
相关推荐
Mybatis批量foreach merge into的用法 Mybatis批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不...
- MyBatis 的强大之处在于其动态 SQL 功能,可以在 XML 映射文件中使用 if、choose、when、otherwise、where、trim、foreach 等标签编写灵活的 SQL。 9. **日志**: - 为了便于调试,MyBatis 提供了日志功能,...
MyBatis 动态 SQL foreach 标签实现批量插入的方法示例 MyBatis 动态 SQL foreach 标签是 MyBatis 框架中的一种动态 SQL 语句,能够实现批量插入、批量删除、批量更新等操作。在本文中,我们将详细介绍使用 foreach...
"Mybatis foreach标签带来的空格、换行、回车问题及解决方案" Mybatis 中的 foreach 标签是一个功能强大的工具,允许开发者在 SQL 语句中循环遍历集合对象。但是,在使用 foreach 标签时,经常会遇到空格、换行、...
在"Mybatis示例"中,我们可以深入探讨以下几个关键知识点: 1. **MyBatis架构**:MyBatis的核心组件包括SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession以及Mapper接口。SqlSessionFactoryBuilder用于...
详解MyBatis foreach collection示例 MyBatis foreach collection是一个非常强大的功能,它允许开发者动态构建In集合条件查询。该功能可以指定一个集合,声明集合项和索引变量,这些变量可以在元素体内使用。此外,...
在"Mybatis示例代码"中,我们可以深入学习MyBatis的核心概念和关键组件。以下是一些主要的知识点: 1. **配置文件**:MyBatis的配置文件(mybatis-config.xml)是整个框架的起点,它定义了数据源、事务管理器、环境...
在Oracle数据库中使用MyBatis的`<foreach>`标签进行批量插入时,可能会遇到“SQL命令未正确结束”的错误。这个问题通常由于Oracle数据库对批量插入语句的语法要求与MySQL等其他数据库系统不同所导致。以下是对这个...
9. **动态SQL**:MyBatis的动态SQL功能非常强大,可以在XML中使用`<if>`, `<choose>`, `<when>`, `<otherwise>`, `<where>`, `<set>`, `<foreach>`等标签实现条件判断、循环等复杂逻辑,使得SQL语句更加灵活。...
MyBatis的`foreach`语句是其动态SQL功能中的一个重要组成部分,主要用于处理SQL语句中的循环和集合数据。在数据库操作中,特别是在构建`IN`条件时,`foreach`非常实用,它可以避免手动拼接SQL字符串,提高代码的...
7. **动态SQL**:MyBatis的动态SQL功能强大,可以在XML映射文件中使用`<if>`, `<choose>`, `<when>`, `<otherwise>`, `<where>`, `<set>`, `<foreach>`等标签实现条件判断和循环。 8. **缓存**:MyBatis内置了第一...
在MyBatis学习的过程中,需要注重实践,阅读示例代码,并且可以参考社区提供的示例和单元测试。若在文档阅读过程中发现错误或遗漏之处,应记录下来并反馈给社区,以帮助改进文档内容。同时,对于文档的翻译和校对,...
- 除了XML方式,Mybatis还支持注解配置,可以直接在Mapper接口的方法上使用注解声明SQL。 5. **参数映射与结果映射** - **参数映射**:Mybatis通过Map、POJO或注解来映射传入参数,实现动态SQL。 - **结果映射**...
mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in action之四实现...
在"01_mybatis.rar"这个压缩包中,我们可以预见到包含的内容可能与MyBatis的基本使用、配置、映射文件以及相关的示例代码有关。下面我们将详细探讨MyBatis的一些关键知识点。 1. **MyBatis简介**: MyBatis是一个...
MyBatis的动态SQL功能非常强大,可以通过if、choose(when/otherwise)、foreach等元素实现条件拼接,灵活生成不同情况下的SQL语句。 6. **缓存机制** MyBatis提供了一级缓存和二级缓存,一级缓存是SqlSession...
在本示例中,我们将深入探讨MyBatis中的动态SQL,以及如何利用它来提高代码的灵活性和可维护性。 首先,动态SQL主要通过`<if>`、`<choose>`(相当于Java中的switch语句)、`<when>`、`<otherwise>`、`<where>`、`...
8. **MyBatis的动态SQL**:`MyBatis-02-Blog`可能涉及更复杂的查询,利用MyBatis的动态SQL特性,如if、choose、where、foreach等标签,实现灵活的SQL拼接。 9. **嵌套查询与关联映射**:`MyBatis-03-Nesting`可能...
在"01课前资料"这个压缩包中,可能包含了Mybatis的基础教程、示例代码、配置文件等内容,帮助学习者理解Mybatis的基本用法和高级特性。通过学习这些资料,你可以掌握如何创建Mapper接口和XML配置文件,如何编写SQL...
MyBatis是目前流行的Java持久层框架之一,它支持普通SQL查询、存储过程以及高级映射,能够将Java对象映射到数据库记录中。MyBatis通过简单的XML或注解配置,允许开发者编写SQL语句,将其映射到接口和POJOs(普通Java...