MyBatis的Mapper文件的foreach标签用来迭代用户传递过来的Lise或者Array,让后根据迭代来拼凑或者批量处理数据。如:使用foreach来拼接in子语句。

在学习MyBatis Mapper文件的foreach标签时我们先看看DTD是如何定义的?DTD代码如下:

<!-- 定义foreach元素 -->
<!ELEMENT foreach (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
<!-- 定义foreach元素的属性 -->
<!ATTLIST foreach
collection CDATA #REQUIRED
item CDATA #IMPLIED
index CDATA #IMPLIED
open CDATA #IMPLIED
close CDATA #IMPLIED
separator CDATA #IMPLIED>

foreach属性详解

collection

该属性指定你要遍历的集合名称,然后在调用该方法的时候,通过参数的方式传递过来。

定义了一个用来获取用户信息的方法,然后使用foreach元素来构建in子语句。这里使用了默认的array,因此可以传递一个数组给这个方法,如下:

userMapper.getUserInfo(new String[]{"val01", "val02", "val03", "val04"});

注意:

(1)List默认的名称为“list”。

(2)数组(Array)的默认名称为“array”。如:

<select id="getUserInfo" resultType="hashmap">
SELECT N_USERID, C_NAME, C_SEX, N_AGE
FROM T_USER
WHERE N_USERID IN
<foreach item="myItem" index="index" collection="array"
open="(" separator="," close=")" >
#{myItem}
</foreach>
</select>

(3)如果指定的名称不是“list”和“array”,则你需要通过Map<String,List>或Map<String,new Object[]>的方式来指定该名称。

Map<String,List<String>> params = new HashMap<String,List<String>>();
params.put("params", Arrays.asList(new String[]{"val01", "val02", "val03", "val04"}) );
userMapper.getUserInfo(params );

上面定义了一个getUserInfo方法用来获取用户信息,然后使用foreach元素来构造in子语句,这里我们使用自定义的myList作为集合参数。

<select id="getUserInfo" parameterType="hashmap" resultType="hashmap">
SELECT N_USERID, C_NAME, C_SEX, N_AGE
FROM T_USER
WHERE N_USERID IN
<foreach item="myItem" index="index" collection="myList"
open="(" separator="," close=")" >
#{myItem}
</foreach>
</select>

item

用来临时存放迭代集合中当前元素的值,便于在foreach中使用。如:

<select id="getUserInfo" parameterType="hashmap" resultType="hashmap">
SELECT N_USERID, C_NAME, C_SEX, N_AGE
FROM T_USER
WHERE N_USERID IN
<foreach item="myItem" index="index" collection="myList"
open="(" separator="," close=")" >
#{myItem}
</foreach>
</select>

在上面的语句中item="myItem",这个值在#{myItem}被使用。

index

这个属性用来指定用来访问迭代集合下标的名称。如:index="myIndex",则#{myIndex}用来访问当前迭代的下标。下标从0开始。

open

将该属性指定的值添加到foreach迭代后拼出字符串的开始。如:拼凑in子语句的开始部分“(”。

close

将该属性指定的值添加到foreach迭代拼出字符串的结尾。如:拼凑in子语句的介绍部分")"。

separator

用来分割foreach元素迭代的每个元素。如:val1,val2,val3

<select id="getUserInfo" parameterType="hashmap" resultType="hashmap">
SELECT N_USERID, C_NAME, C_SEX, N_AGE
FROM T_USER
WHERE N_USERID IN
<foreach item="myItem" index="index" collection="myList"
open="(" separator="," close=")" >
#{myItem}
</foreach>
</select>

如果传递给上面方法的数组是

String[] array = new String[]{"val1", "val2", "val3"};
userMapper.getUserInfo(array);
// 拼凑出的字符串:(val1,val2,val3)

MyBatis的Mapper文件的foreach标签详解的更多相关文章

  1. Mybatis批量insert 返回主键值和foreach标签详解

    Mybatis批量insert 返回主键 Mybatis从3.3.1版本开始,支持批量插入后返回主键ID.首先对于支持自增主键的数据库使用useGenerateKeys和keyProperty,对于不 ...

  2. JSTL-c:forEach标签详解

    c:forEach基本格式: <c:forEach var="每个变量名字" items="要迭代的list" varStatus="每个对象的 ...

  3. ROS中.launch文件的remap标签详解

    https://www.cnblogs.com/LiuQiang921202/p/7679943.html

  4. 逆向工程生成的mybatis中mapper文件。mapper接口,实例化成对象

    逆向工程生成的mybatis中mapper文件中,*mapper文件只是接口,而不是类文件.但是却可以通过spring的容器获得实例. 例如: //1.获得mapper代理对象,从spring容器获得 ...

  5. 自动生成Mybatis的Mapper文件

    自动生成Mybatis的Mapper文件 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,myba ...

  6. Meta标签详解(HTML JAVASCRIPT)

    Meta标签详解,在网上转的,希望对大家有用 您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广 个人网站,人们首先想到的方法无外乎以下几种: ● 在搜索引擎中 ...

  7. 网页设计:Meta标签详解

    很多人忽视了HTML标签META的强大功效,一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性,有兴趣吗,谁我来重新认识一下META标签吧! META标签是HTML语言HEAD区的一个辅 ...

  8. meta标签详解(meta标签的作用)///////////////////////////转

    meta标签详解(meta标签的作用) 很多人却忽视了HTML标签META的强大功效,一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性,有兴趣吗,谁我来重新认识一下META标签吧   ...

  9. 引用 struts2标签详解 - wo的的日志 - 网易博客

    引用 元元 的 struts2标签详解   引用 COLD 的 struts2标签详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@t ...

随机推荐

  1. MyEclipse使用心得:SVN插件安装方法

    1.在线安装,打开myeclipse,help--->MyEclipse Configuration Center 2.点击Add Site 打开对话框,在对话框Name输入Svn,URL中输入 ...

  2. 自定义AlertDialog控件的使用(AndroidStudio)

    AlertDialog 第一种:可随意自定义控件 第一步:自定义弹出的页面 ,新建一个XML页面 如下图  不需要Activity 第二步:在主页面设置一个按钮弹出上图页面  (下面是主要代码  调用 ...

  3. 使用AIDL调用远程服务设置系统时间

    在实际工作中,经常遇到客户需要用代码设置系统时间的需求,但是Android非系统应用是无法设置系统时间的.于是,我设计了一个使用系统签名的时间设置服务,客户通过bind调用服务里的方法就能达到设置时间 ...

  4. 优质Android小部件:索尼滚动相册

    虽然骚尼手机卖的不怎么样,但是有些东西还是做的挺好的,工业设计就不用说了,索尼的相册的双指任意缩放功能也是尤其炫酷.其桌面小部件滚动相册我觉得也挺好的,比谷歌原生的相册墙功能好多了,网上搜了一下也没发 ...

  5. iOS之UIApplication详解

    UIApplication对象特点: 特点1: UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序,而且是单例的.(用来封装整个应用程序的一个对象, ...

  6. OC 观察者模式(通知中心,KVO)

    OC 观察者模式(通知中心,KVO) 什么是观察者模式??? A对B的变化感兴趣,就注册为B的观察者,当B发生变化时通知A,告知B发生了变化.这就是观察者模式. 观察者模式定义了一种一对多的依赖关系, ...

  7. IOS开发之Bug--使用xib的自动布局和代码中修改遇到的bug

    首先,在xib中约束了宽高22,但是需要代码动态重设,所以一开始如下设置,但是实际显示的仍然是22,而不是重设的值: 然后直接拿xib的将布局约束对象拖线重新通过代码重设约束值,虽然打印的结果宽高值是 ...

  8. 敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)

        我们将在广州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战技巧. 时间:2 ...

  9. Git 工作流程

    Git 作为一个源码管理系统,不可避免涉及到多人协作. 协作必须有一个规范的工作流程,让大家有效地合作,使得项目井井有条地发展下去.”工作流程”在英语里,叫做”workflow”或者”flow”,原意 ...

  10. Why Do We Need a Data Warehouse?

    https://dwbi1.wordpress.com/2012/12/03/why-do-we-need-a-data-warehouse/ 经常有人来质疑数据仓库的价值,为什么我们需要花费一年多的 ...