`

Mybatis 示例之 foreach (上)

 
阅读更多

 

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

 

  1. drop table users if exists;  
  2.   
  3. create table users (  
  4.   id int,  
  5.   name varchar(20)  
  6. );  
  7.   
  8. insert into users (id, namevalues(1, 'User1');  
  9. insert into users (id, namevalues(2, 'User2');  
  10. insert into users (id, namevalues(3, 'User3');  
  11. insert into users (id, namevalues(4, 'User4');  
  12. insert into users (id, namevalues(5, 'User5');  
  13. insert into users (id, namevalues(6, 'User6');  

 

 

User类


 

Mapper.xml

 

  1. <select id="countByUserList" resultType="_int" parameterType="list">  
  2. select count(*) from users  
  3.   <where>  
  4.     id in  
  5.     <foreach item="item" collection="list" separator="," open="(" close=")" index="">  
  6.       #{item.id, jdbcType=NUMERIC}  
  7.     </foreach>  
  8.   </where>  
  9. </select>  


测试代码:

  1. @Test  
  2. public void shouldHandleComplexNullItem() {  
  3. SqlSession sqlSession = sqlSessionFactory.openSession();  
  4. try {  
  5.   Mapper mapper = sqlSession.getMapper(Mapper.class);  
  6.   User user1 = new User();  
  7.   user1.setId(2);  
  8.   user1.setName("User2");  
  9.   List<User> users = new ArrayList<User>();  
  10.   users.add(user1);  
  11.   users.add(null);  
  12.   int count = mapper.countByUserList(users);  
  13.   Assert.assertEquals(1, count);  
  14. finally {  
  15.   sqlSession.close();  
  16. }  
  17. }  


测试日志:

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批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不...

    mybatis 示例

    - MyBatis 的强大之处在于其动态 SQL 功能,可以在 XML 映射文件中使用 if、choose、when、otherwise、where、trim、foreach 等标签编写灵活的 SQL。 9. **日志**: - 为了便于调试,MyBatis 提供了日志功能,...

    MyBatis动态SQL foreach标签实现批量插入的方法示例

    MyBatis 动态 SQL foreach 标签实现批量插入的方法示例 MyBatis 动态 SQL foreach 标签是 MyBatis 框架中的一种动态 SQL 语句,能够实现批量插入、批量删除、批量更新等操作。在本文中,我们将详细介绍使用 foreach...

    Mybatis中foreach标签带来的空格\换行\回车问题及解决方案

    "Mybatis foreach标签带来的空格、换行、回车问题及解决方案" Mybatis 中的 foreach 标签是一个功能强大的工具,允许开发者在 SQL 语句中循环遍历集合对象。但是,在使用 foreach 标签时,经常会遇到空格、换行、...

    mybatis示例

    在"Mybatis示例"中,我们可以深入探讨以下几个关键知识点: 1. **MyBatis架构**:MyBatis的核心组件包括SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession以及Mapper接口。SqlSessionFactoryBuilder用于...

    详解mybatis foreach collection示例

    详解MyBatis foreach collection示例 MyBatis foreach collection是一个非常强大的功能,它允许开发者动态构建In集合条件查询。该功能可以指定一个集合,声明集合项和索引变量,这些变量可以在元素体内使用。此外,...

    mybatis示例代码

    在"Mybatis示例代码"中,我们可以深入学习MyBatis的核心概念和关键组件。以下是一些主要的知识点: 1. **配置文件**:MyBatis的配置文件(mybatis-config.xml)是整个框架的起点,它定义了数据源、事务管理器、环境...

    Oracle+Mybatis的foreach insert批量插入报错的快速解决办法

    在Oracle数据库中使用MyBatis的`&lt;foreach&gt;`标签进行批量插入时,可能会遇到“SQL命令未正确结束”的错误。这个问题通常由于Oracle数据库对批量插入语句的语法要求与MySQL等其他数据库系统不同所导致。以下是对这个...

    mybatis开发示例

    9. **动态SQL**:MyBatis的动态SQL功能非常强大,可以在XML中使用`&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`, `&lt;where&gt;`, `&lt;set&gt;`, `&lt;foreach&gt;`等标签实现条件判断、循环等复杂逻辑,使得SQL语句更加灵活。...

    MyBatis的foreach语句详解

    MyBatis的`foreach`语句是其动态SQL功能中的一个重要组成部分,主要用于处理SQL语句中的循环和集合数据。在数据库操作中,特别是在构建`IN`条件时,`foreach`非常实用,它可以避免手动拼接SQL字符串,提高代码的...

    mybatis代码示例

    7. **动态SQL**:MyBatis的动态SQL功能强大,可以在XML映射文件中使用`&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`, `&lt;where&gt;`, `&lt;set&gt;`, `&lt;foreach&gt;`等标签实现条件判断和循环。 8. **缓存**:MyBatis内置了第一...

    mybatis入门学习资料

    在MyBatis学习的过程中,需要注重实践,阅读示例代码,并且可以参考社区提供的示例和单元测试。若在文档阅读过程中发现错误或遗漏之处,应记录下来并反馈给社区,以帮助改进文档内容。同时,对于文档的翻译和校对,...

    Mybatis系列学习源码

    - 除了XML方式,Mybatis还支持注解配置,可以直接在Mapper接口的方法上使用注解声明SQL。 5. **参数映射与结果映射** - **参数映射**:Mybatis通过Map、POJO或注解来映射传入参数,实现动态SQL。 - **结果映射**...

    springmybatis

    mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in action之四实现...

    01_mybatis.rar

    在"01_mybatis.rar"这个压缩包中,我们可以预见到包含的内容可能与MyBatis的基本使用、配置、映射文件以及相关的示例代码有关。下面我们将详细探讨MyBatis的一些关键知识点。 1. **MyBatis简介**: MyBatis是一个...

    mybatis源码分析视频

    MyBatis的动态SQL功能非常强大,可以通过if、choose(when/otherwise)、foreach等元素实现条件拼接,灵活生成不同情况下的SQL语句。 6. **缓存机制** MyBatis提供了一级缓存和二级缓存,一级缓存是SqlSession...

    MyBatis 中动态 SQL 的示例

    在本示例中,我们将深入探讨MyBatis中的动态SQL,以及如何利用它来提高代码的灵活性和可维护性。 首先,动态SQL主要通过`&lt;if&gt;`、`&lt;choose&gt;`(相当于Java中的switch语句)、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;where&gt;`、`...

    mybatis入门项目代码

    8. **MyBatis的动态SQL**:`MyBatis-02-Blog`可能涉及更复杂的查询,利用MyBatis的动态SQL特性,如if、choose、where、foreach等标签,实现灵活的SQL拼接。 9. **嵌套查询与关联映射**:`MyBatis-03-Nesting`可能...

    Mybatis相关

    在"01课前资料"这个压缩包中,可能包含了Mybatis的基础教程、示例代码、配置文件等内容,帮助学习者理解Mybatis的基本用法和高级特性。通过学习这些资料,你可以掌握如何创建Mapper接口和XML配置文件,如何编写SQL...

    MyBatis官方中文参考手册

    MyBatis是目前流行的Java持久层框架之一,它支持普通SQL查询、存储过程以及高级映射,能够将Java对象映射到数据库记录中。MyBatis通过简单的XML或注解配置,允许开发者编写SQL语句,将其映射到接口和POJOs(普通Java...

Global site tag (gtag.js) - Google Analytics