MyBatis的Mapper文件的foreach标签详解

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

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

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

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

foreach属性详解

collection

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

注意:

(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>

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

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

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

<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>

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

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

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 教程,了解更多的 MyBatis 知识!

一知半解的人,多不谦虚;见多识广有本领的人,一定谦虚。——谢觉哉
0 不喜欢
说说我的看法 -
全部评论(

foreach属性详解-collection 第 (3) 点 params 的 key 是不是应该为 "myList"?参考:https://www.cnblogs.com/zhangxl1016/articles/15401098.html

回复:

非常感谢,经过验证确实写错了,修改前:

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

修改后:

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


关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号