文档章节

Mybatis 中 foreach collection 的三种用法

dreamcloudz
 dreamcloudz
发布于 2017/05/25 16:16
字数 754
阅读 50
收藏 0

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。

foreach元素的属性主要有 item,index,collection,open,separator,close。

  1.     item表示集合中每一个元素进行迭代时的别名,
  2.     index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
  3.     open表示该语句以什么开始,
  4.     separator表示在每次进行迭代之间以什么符号作为分隔 符,
  5.     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}
        //当连接Oracle数据库时,应添加item对应的类型(list中对象的类型)
        //#{item,jdbcType=VARCHAR}
    </foreach>
</select>

上述collection的值为list,对应的Mapper代码:

public List dynamicForeachTest(List ids);

测试代码:

@Test
public void dynamicForeachTest() {
	SqlSession session = Util.getSqlSessionFactory().openSession();
	BlogMapper blogMapper = session.getMapper(BlogMapper.class);
	List ids = new ArrayList();
	ids.add(1);
	ids.add(3);
	ids.add(6);
	List 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}
        //当连接Oracle数据库时,应添加item对应的类型(list中对象的类型)
        //#{item,jdbcType=VARCHAR}
    </foreach>
</select>

上述collection为array,对应的Mapper代码:

public List 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 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}
        //当连接Oracle数据库时,应添加item对应的类型(list中对象的类型)
        //#{item,jdbcType=VARCHAR}
    </foreach>
</select>

上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码: 

public List dynamicForeach3Test(Map params);

测试代码:

@Test
public void dynamicForeach3Test() {
	SqlSession session = Util.getSqlSessionFactory().openSession();
	BlogMapper blogMapper = session.getMapper(BlogMapper.class);
	final List ids = new ArrayList();
	ids.add(1);
	ids.add(2);
	ids.add(3);
	ids.add(6);
	ids.add(7);
	ids.add(9);
	Map params = new HashMap();
	params.put("ids", ids);
	params.put("title", "中国");
	List blogs = blogMapper.dynamicForeach3Test(params);
	for (Blog blog : blogs)
		System.out.println(blog);
	session.close();
}

 

本文转载自:http://www.cnblogs.com/fangyu19900812/p/6046209.html

dreamcloudz
粉丝 1
博文 22
码字总数 2322
作品 0
海淀
程序员
私信 提问
MyBatis 中 foreach collection的三种用法

foreach主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。 foreach元素的属性主要有 item,index,collection,open,separator,close。 在使用foreach的时候最关键的也是最容易出...

干干
2017/12/20
159
0
MyBatis的动态SQL详解

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach if就...

sol.tao
2012/06/26
145
0
mybatis(九)强大的动态SQL

上篇文章简单介绍了mybatis的查询,至此,CRUD都已讲完。本文将介绍mybatis强大的动态SQL。 那么,问题来了: 什么是动态SQL? 动态SQL有什么作用?   传统的使用JDBC的方法,相信大家在组合...

LCZ777
2014/12/20
56
0
MyBatis的foreach语句详解

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别...

墙头草
2012/01/10
35.3K
8
MyBatis动态SQL之foreach用法

首先简单说下foreach六个属性 item 每一次迭代结果 collection 循环集合成指定类型 separator 元素之间的分隔符,可选 open 开始符号,可选 close 关闭符号,可选 index list和数组的序号,可...

IT-Mamba
2015/08/24
11K
1

没有更多内容

加载失败,请刷新页面

加载更多

分页查询

一、配置 /*** @author beth* @data 2019-10-14 20:01*/@Configurationpublic class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ ......

一个yuanbeth
15分钟前
2
0
在LINQPad中使用Ignite.NET

LINQPad是进行.NET开发的一款优秀工具,非常有利于Ignite.NET API的快速入门。 入门 下载LINQPad:linqpad.net/Download.aspx,注意要选择64位操作系统的AnyCPU版本; 安装Ignite.NET的NuGet...

李玉珏
29分钟前
2
0
JS其他类型值转化为Boolean类型规则

本文转载于:专业的前端网站➤JS其他类型值转化为Boolean类型规则 由于最近在笔试的时候,发现好多关于其他类型转化为Boolean类型的题目,因此总结一下! 一、String类型转化为Boolean 1.转化...

前端老手
40分钟前
4
0
EurekaClient自动装配及启动流程解析

在上篇文章中,我们简单介绍了EurekaServer自动装配及启动流程解析,本篇文章则继续研究EurekaClient的相关代码 老规矩,先看spring.factories文件,其中引入了一个配置类EurekaDiscoveryClie...

Java学习录
46分钟前
8
0
析构函数是否必须为虚函数?为何?

p517 在C++中,基类指针可以指向一个派生类的对象。如果基类的析构函数不是虚函数,当需要delete这个指向派生类的基类指针时,就只会调用基类的析构函数,而派生类的析构函数无法被调用。容易...

天王盖地虎626
46分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部