`
atgoingguoat
  • 浏览: 195798 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

MyBatis的foreach语句详解

 
阅读更多

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

 

下面分别来看看上述三种情况的示例代码:

1.单参数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();
    }
2.单参数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();
    }
3.自己把参数封装成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 标签的使用详解 MyBatis 中的 foreach 标签是非常常用的标签之一,它可以用来遍历集合,构建 in 条件语句或者批量操作语句。本文将详细介绍 MyBatis foreach 标签的使用详解。 foreach 标签的基本...

    mybatis动态sql语句详解

    ### MyBatis动态SQL语句详解 #### 一、MyBatis简介 MyBatis是一个优秀的持久层框架,它支持自定义SQL语句、存储过程以及高级映射功能。通过使用MyBatis,开发人员可以避免编写大量的JDBC代码和手动设置参数以及...

    mybatis常用语句和lyaui 多条件查询加分页

    ### MyBatis常用语句详解及Lyaui多条件查询加分页 #### 一、概述 在本篇文章中,我们将详细介绍MyBatis框架中的几种常用SQL语句编写方法及其应用场景,特别是针对数据库的增删改查操作。这些操作是任何Web应用开发...

    MyBatis动态SQL详解.pdf

    ### MyBatis动态SQL详解 #### 一、MyBatis动态SQL概述 在传统的Java数据库连接(JDBC)中,为了实现对数据库的操作,我们往往需要编写大量的代码来进行SQL语句的拼接。这种方式不仅降低了代码的可读性和可维护性,...

    Mybatis中动态SQL,if,where,foreach的使用教程详解

    `foreach`是MyBatis处理数组或集合非常有用的标签,它可以迭代集合中的每个元素,并将其插入到SQL语句中。例如,如果我们有一个包含多个ID的列表,我们想根据这些ID查询用户,可以这样使用`foreach`: ```xml ...

    MyBatis中Foreach参数问题.doc

    ### MyBatis中Foreach参数问题详解 #### 一、问题背景 在使用MyBatis进行数据库操作时,经常会遇到一些参数传递的问题,特别是在使用`foreach`语句处理集合数据时,很容易出现“Parameter 'xxxList' not found. ...

    详解MyBatis直接执行SQL查询及数据批量插入

    MyBatis是一个强大的持久层框架,它允许开发者直接编写SQL语句,简化了数据库操作。在本文中,我们将深入探讨如何使用MyBatis直接执行SQL查询以及如何进行数据的批量插入。 **一、直接执行SQL查询** 在MyBatis中,...

    MyBatis.pdf

    MyBatis 提供了多种 SQL 语句构建方式,包括 if 标签、where 标签、choose 标签、set 标签、trim 标签和 foreach 标签等。 MyBatis 的常用标签 MyBatis 提供了多种常用标签,包括 bind 标签、select 标签、insert ...

    MyBatis 执行动态 SQL语句详解

    这时,MyBatis 提供了 `&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;` 等标签来实现动态 SQL。例如,`enabled` 和 `userName` 可能是可选的查询条件,我们可以使用 `&lt;if&gt;` 标签来...

    mybatis的动态sql详解(精)

    MyBatis的动态SQL是其强大特性的体现,它基于OGNL(Object-Graph Navigation Language)表达式,使得在SQL语句中实现复杂的逻辑变得轻松。动态SQL的主要目的是避免手动拼接SQL字符串,减少错误并提高代码的可读性...

    MyBatis用法

    - SQL映射文件:MyBatis通过XML或注解方式定义SQL语句,将数据库操作与代码分离,提高可维护性。 - Mapper接口:用于调用SQL映射文件中的SQL,提供方法与SQL一一对应。 - SQLSession:执行SQL和获取结果的对象,...

    mybatis详解并且带模板

    在实际开发中,我们通常会定义一个Mapper接口,这个接口代表了数据库操作的一个业务逻辑,然后通过MyBatis的注解或者XML配置文件将这个接口的方法与SQL语句关联起来。当调用接口方法时,MyBatis会自动执行对应的SQL...

    MyBatis的动态SQL详解[借鉴].pdf

    总结来说,MyBatis的动态SQL通过`if`、`choose`(`when`、`otherwise`)、`trim`、`where`和`foreach`等元素,使得SQL语句的编写更加灵活,降低了维护成本,提高了代码的可读性和可维护性。这些元素的使用让开发者...

    MyBatis主配置文件

    - **`&lt;foreach&gt;` 标签**:用于遍历集合,生成 SQL 语句中的 IN 子句或批量操作。 通过 MyBatis,开发者可以灵活地编写 SQL,实现更高效、更精确的数据访问。同时,结合 Spring,可以实现事务管理、依赖注入等高级...

    mybatis详解教程

    MyBatis允许在XML映射文件中使用条件语句、foreach循环等,实现动态SQL,极大增强了SQL的灵活性。 9. **缓存机制** MyBatis提供了本地缓存和二级缓存机制,可以在一定程度上提高数据读取速度。 10. **事务管理**...

    详解Java的MyBatis框架中SQL语句映射部分的编写

    在Java的MyBatis框架中,SQL语句映射部分是整个ORM(对象关系映射)过程中的核心组件,它负责将SQL查询结果转化为Java对象。这篇教程将深入讲解SQL映射XML文件的编写,主要关注`resultMap`以及增删查改(CRUD)的...

    尚硅谷 4月份MyBatis视频教程(国内首套:源码级讲授的MyBatis视频)最新更新

    MyBatis支持多种动态SQL的编写方式,如`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签,这些标签可以实现复杂的条件判断和循环逻辑。 #### 3.2 映射器 - **简单映射器**:...

    mybatis笔记

    在MyBatis中可以通过`foreach`标签实现动态拼接`IN`子句。 #### 十八、动态SQL标签详解 - **动态SQL**:MyBatis提供了多种动态SQL标签,如`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;trim&gt;`等,其中`&lt;where&gt;...

Global site tag (gtag.js) - Google Analytics