• MyBatis的Mapper文件的foreach标签详解


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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- 定义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)
  • 相关阅读:
    Filter ,Interceptor,AOP
    React路由官方网站
    React的UI库以及国内镜像
    HBuilder+个推 实现app推动消息
    基于create-react-app再次配置
    使用 ES7 的 async/await 时报错—Uncaught ReferenceError: regeneratorRuntime is not defined
    微信小程序学习网站
    我的github地址
    如何在github搭建自己的项目
    Vue简单封装axios—解决post请求后端接收不到参数问题
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/12151784.html
Copyright © 2020-2023  润新知