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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM