MyBatis的Mapper文件的foreach标签详解
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标签详解的更多相关文章
- Mybatis批量insert 返回主键值和foreach标签详解
Mybatis批量insert 返回主键 Mybatis从3.3.1版本开始,支持批量插入后返回主键ID.首先对于支持自增主键的数据库使用useGenerateKeys和keyProperty,对于不 ...
- JSTL-c:forEach标签详解
c:forEach基本格式: <c:forEach var="每个变量名字" items="要迭代的list" varStatus="每个对象的 ...
- ROS中.launch文件的remap标签详解
https://www.cnblogs.com/LiuQiang921202/p/7679943.html
- 逆向工程生成的mybatis中mapper文件。mapper接口,实例化成对象
逆向工程生成的mybatis中mapper文件中,*mapper文件只是接口,而不是类文件.但是却可以通过spring的容器获得实例. 例如: //1.获得mapper代理对象,从spring容器获得 ...
- 自动生成Mybatis的Mapper文件
自动生成Mybatis的Mapper文件 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,myba ...
- Meta标签详解(HTML JAVASCRIPT)
Meta标签详解,在网上转的,希望对大家有用 您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广 个人网站,人们首先想到的方法无外乎以下几种: ● 在搜索引擎中 ...
- 网页设计:Meta标签详解
很多人忽视了HTML标签META的强大功效,一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性,有兴趣吗,谁我来重新认识一下META标签吧! META标签是HTML语言HEAD区的一个辅 ...
- meta标签详解(meta标签的作用)///////////////////////////转
meta标签详解(meta标签的作用) 很多人却忽视了HTML标签META的强大功效,一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性,有兴趣吗,谁我来重新认识一下META标签吧 ...
- 引用 struts2标签详解 - wo的的日志 - 网易博客
引用 元元 的 struts2标签详解 引用 COLD 的 struts2标签详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@t ...
随机推荐
- TouchDevelop [Mobile App]
TouchDevelop是一个全新的Windows Phone软件开发环境,是第一个可以使用手机编程的应用. 所用语言看上去有点像BASIC,也有Scratch和AppInventor那样的色块拖拽环 ...
- [Android]对MVC和MVP的总结
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5036289.html 经历过的客户端的架构分为这么几个阶段: ...
- Android开发学习——应用安装过程
首先一个android项目,然后编译和打包,将.java文件编译为.class,.class编译为.dex,将所有文件打包为一个apk,只编译代码,不编译资源. .apk里面的.arsc是资源的索引, ...
- iOS多线程之2.NSThread的加锁@synchronized
我在上一篇文章讲了线程的生命周期,这篇文章来讲讲线程加锁的注意事项与@synchronized关键字. 那什么时候需要加锁呢,就是当多条线程同时操作一个变量时,就需要加锁了.至于为什么要加锁,可以 ...
- Linux日志不记录问题
问题原因 查看/var/log/secure发现日志为空,不记录. 查看/var/log/messages发现日志文件过大,然后做了如下操作 mv messages messages-xxxxxxxx ...
- SSTABLE简介
SSTABLE数据组织:http://blog.csdn.net/tankles/article/details/7663905
- 配置安装ecplise跑项目
jdk配置:http://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html系统变量→新建 JAVA_HOME 变量 .变量值填写jdk的安 ...
- python中的常用方法
1.os模块的常用方法: >>> import os >>> >>> myFiles = ['accounts.txt', 'details.cs ...
- pycharm的使用破解和Anaconda的使用
1.pycharm的破解: 版本: pycharm 2016.2.3 链接: 下载专业版本 下面是这个版本的注册码: 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTcz ...
- What is a RaycastHit normal?
The normal is the direction pointing away from the collider it hits. http://answers.unity3d.com/ques ...