foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key
下面分别来看看上述三种情况的示例代码:
-
单参数List的类型:
<select id="dynamicForeachTest" resultType="Blog"> select * from t_blog where id in <foreach collection="list" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> </select>
上述collection的值为list,对应的Mapper是这样的public List<Blog> dynamicForeachTest(List<Integer> ids);
测试代码:
@Test public void dynamicForeachTest() { SqlSession session = Util.getSqlSessionFactory().openSession(); BlogMapper blogMapper = session.getMapper(BlogMapper.class); List<Integer> ids = new ArrayList<Integer>(); ids.add(1); ids.add(3); ids.add(6); List<Blog> blogs = blogMapper.dynamicForeachTest(ids); for (Blog blog : blogs) System.out.println(blog); session.close(); }
- 单参数array数组的类型:
<select id="dynamicForeach2Test" resultType="Blog"> select * from t_blog where id in <foreach collection="array" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> </select>
上述collection为array,对应的Mapper代码:public List<Blog> dynamicForeach2Test(int[] ids);
对应的测试代码:
@Test public void dynamicForeach2Test() { SqlSession session = Util.getSqlSessionFactory().openSession(); BlogMapper blogMapper = session.getMapper(BlogMapper.class); int[] ids = new int[] {1,3,6,9}; List<Blog> blogs = blogMapper.dynamicForeach2Test(ids); for (Blog blog : blogs) System.out.println(blog); session.close(); }
- 自己把参数封装成Map的类型
<select id="dynamicForeach3Test" resultType="Blog"> select * from t_blog where title like "%"#{title}"%" and id in <foreach collection="ids" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> </select>
上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:public List<Blog> dynamicForeach3Test(Map<String, Object> params);
对应测试代码:
@Test public void dynamicForeach3Test() { SqlSession session = Util.getSqlSessionFactory().openSession(); BlogMapper blogMapper = session.getMapper(BlogMapper.class); final List<Integer> ids = new ArrayList<Integer>(); ids.add(1); ids.add(2); ids.add(3); ids.add(6); ids.add(7); ids.add(9); Map<String, Object> params = new HashMap<String, Object>(); params.put("ids", ids); params.put("title", "中国"); List<Blog> blogs = blogMapper.dynamicForeach3Test(params); for (Blog blog : blogs) System.out.println(blog); session.close(); }
相关推荐
MyBatis foreach 标签的使用详解 MyBatis 中的 foreach 标签是非常常用的标签之一,它可以用来遍历集合,构建 in 条件语句或者批量操作语句。本文将详细介绍 MyBatis foreach 标签的使用详解。 foreach 标签的基本...
### MyBatis动态SQL语句详解 #### 一、MyBatis简介 MyBatis是一个优秀的持久层框架,它支持自定义SQL语句、存储过程以及高级映射功能。通过使用MyBatis,开发人员可以避免编写大量的JDBC代码和手动设置参数以及...
### MyBatis常用语句详解及Lyaui多条件查询加分页 #### 一、概述 在本篇文章中,我们将详细介绍MyBatis框架中的几种常用SQL语句编写方法及其应用场景,特别是针对数据库的增删改查操作。这些操作是任何Web应用开发...
### MyBatis动态SQL详解 #### 一、MyBatis动态SQL概述 在传统的Java数据库连接(JDBC)中,为了实现对数据库的操作,我们往往需要编写大量的代码来进行SQL语句的拼接。这种方式不仅降低了代码的可读性和可维护性,...
`foreach`是MyBatis处理数组或集合非常有用的标签,它可以迭代集合中的每个元素,并将其插入到SQL语句中。例如,如果我们有一个包含多个ID的列表,我们想根据这些ID查询用户,可以这样使用`foreach`: ```xml ...
### MyBatis中Foreach参数问题详解 #### 一、问题背景 在使用MyBatis进行数据库操作时,经常会遇到一些参数传递的问题,特别是在使用`foreach`语句处理集合数据时,很容易出现“Parameter 'xxxList' not found. ...
MyBatis是一个强大的持久层框架,它允许开发者直接编写SQL语句,简化了数据库操作。在本文中,我们将深入探讨如何使用MyBatis直接执行SQL查询以及如何进行数据的批量插入。 **一、直接执行SQL查询** 在MyBatis中,...
MyBatis 提供了多种 SQL 语句构建方式,包括 if 标签、where 标签、choose 标签、set 标签、trim 标签和 foreach 标签等。 MyBatis 的常用标签 MyBatis 提供了多种常用标签,包括 bind 标签、select 标签、insert ...
这时,MyBatis 提供了 `<if>`、`<choose>`、`<when>`、`<otherwise>`、`<where>`、`<set>`、`<foreach>` 等标签来实现动态 SQL。例如,`enabled` 和 `userName` 可能是可选的查询条件,我们可以使用 `<if>` 标签来...
MyBatis的动态SQL是其强大特性的体现,它基于OGNL(Object-Graph Navigation Language)表达式,使得在SQL语句中实现复杂的逻辑变得轻松。动态SQL的主要目的是避免手动拼接SQL字符串,减少错误并提高代码的可读性...
- SQL映射文件:MyBatis通过XML或注解方式定义SQL语句,将数据库操作与代码分离,提高可维护性。 - Mapper接口:用于调用SQL映射文件中的SQL,提供方法与SQL一一对应。 - SQLSession:执行SQL和获取结果的对象,...
在实际开发中,我们通常会定义一个Mapper接口,这个接口代表了数据库操作的一个业务逻辑,然后通过MyBatis的注解或者XML配置文件将这个接口的方法与SQL语句关联起来。当调用接口方法时,MyBatis会自动执行对应的SQL...
总结来说,MyBatis的动态SQL通过`if`、`choose`(`when`、`otherwise`)、`trim`、`where`和`foreach`等元素,使得SQL语句的编写更加灵活,降低了维护成本,提高了代码的可读性和可维护性。这些元素的使用让开发者...
- **`<foreach>` 标签**:用于遍历集合,生成 SQL 语句中的 IN 子句或批量操作。 通过 MyBatis,开发者可以灵活地编写 SQL,实现更高效、更精确的数据访问。同时,结合 Spring,可以实现事务管理、依赖注入等高级...
MyBatis允许在XML映射文件中使用条件语句、foreach循环等,实现动态SQL,极大增强了SQL的灵活性。 9. **缓存机制** MyBatis提供了本地缓存和二级缓存机制,可以在一定程度上提高数据读取速度。 10. **事务管理**...
在Java的MyBatis框架中,SQL语句映射部分是整个ORM(对象关系映射)过程中的核心组件,它负责将SQL查询结果转化为Java对象。这篇教程将深入讲解SQL映射XML文件的编写,主要关注`resultMap`以及增删查改(CRUD)的...
MyBatis支持多种动态SQL的编写方式,如`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<where>`、`<set>`、`<foreach>`等标签,这些标签可以实现复杂的条件判断和循环逻辑。 #### 3.2 映射器 - **简单映射器**:...
在MyBatis中可以通过`foreach`标签实现动态拼接`IN`子句。 #### 十八、动态SQL标签详解 - **动态SQL**:MyBatis提供了多种动态SQL标签,如`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`等,其中`<where>...