1. 程式人生 > >Mybatis批量insert 返回主鍵值和foreach標籤詳解

Mybatis批量insert 返回主鍵值和foreach標籤詳解

 

Mybatis批量insert 返回主鍵

Mybatis從3.3.1版本開始,支援批量插入後返回主鍵ID。首先對於支援自增主鍵的資料庫使用useGenerateKeys和keyProperty,對於不支援生成自增主鍵的資料庫使用selectKey標籤。類似《MyBatis 返回insert操作主鍵》中單條插入。

使用批量插入,可以減少和資料庫互動的次數,但是,資料量應該做一個控制,和for迴圈類似。首先定義Java Bean Instance:

import java.io.Serializable;

 

/**

 * 例項表實體類

 */

public class Instance implements Serializable {

    private static final long serialVersionUID = 2288066394131442938L;

 

    private Long instanceId;

    private String infos;

    private String createTime;

    private String updateTime;

    // omit getter, setter and toString()

}

DAO層:

int addInstances(List<Instance> instanceDtos);

函式返回值是int型別,表示影響的行數。mapper中SQL寫法類似於執行單條insert操作,只是使用了foreach標籤:

<insert id="addInstances" parameterType="list" useGeneratedKeys="true" keyProperty="instanceId">

   insert into instance (infos,create_time,update_time)

   values

    <foreach collection="list" item="myEg" index="index" separator=",">

         (#{myEg.infos},now(),now()})

     </foreach>

 </insert>

執行後,自增長的id都可以從instanceDtos中找到。由於myEg對應於Java物件,所以,讀取其中的infos屬性時,需要使用myEg.infos。

MyBatis foreach標籤詳解

下面梳理一下foreach標籤。foreach主要用於構建in條件,它可以在SQL語句中迭代入參List或者Array。屬性主要有 item,index,collection,open,separator,close,解釋如下:

item表示集合中每一個元素進行迭代時的別名,便於在foreach中使用;

index指定一個名字,用於標誌當前迭代位置;

open表示該語句以什麼開始,如拼湊in子語句的左括號“(”;

separator分隔符,表示每次迭代之間以什麼符號分隔;

close表示以什麼結束,如拼湊in子語句的右括號“)”。

在所有屬性中,最複雜非collection屬性莫屬,該屬性在foreach標籤中必須指定的。在不同情況下,該屬性的值是不一樣的,主要有以下3種情況:

1.若傳入的是單引數且引數型別是List,則collection屬性值為list;

2.若傳入的是單引數且引數型別是Array陣列,則collection的屬性值為array;

3.若傳入的引數是多個,則把它們封裝成Map,當然單引數也可以封裝成Map,collection的屬性值為Map中的key;

上一節中,addInstances函式的入參只有一個,且是List,所以,collection屬性值為list。如下函式

List<Instance> getInstanceInfo(new Long[]{1L, 3L});

請求的時候,SQL如下:

<select id="getInstanceInfo" resultType="list">

    SELECT instance_id "instanceId", infos

      FROM instance

     WHERE instance_id IN

    <foreach item="oneId" index="index" collection="array"

        open="(" separator="," close=")" >

        #{oneId}

    </foreach>

</select>

oneId表示一個具體的元素,所以,用#{oneId}直接讀取就行。