1. 程式人生 > >MyBatis foreach語句批量插入資料

MyBatis foreach語句批量插入資料

本例技術:Spring+SpringMVC+MyBatis+Oracle

問題描述:需要將程式裡的一個集合儲存到資料庫裡,集合的型別對應資料庫的一個實體,若在程式裡遍歷集合再一條條儲存到資料庫表中有點麻煩,這裡可以利用MyBatis 的 foreach語句實現批量插入資料。

核心程式碼清單:

Item(實體類):

public class Item {
    private String itemCode;//專案程式碼
    private String itemName;//專案名稱
    private String itemValue;//專案值(多個值用逗號隔開)
    private String itemCategory;//專案所屬類別

    public String getItemCode() {
        return itemCode;
    }

    public void setItemCode(String itemCode) {
        this.itemCode = itemCode;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public String getItemValue() {
        return itemValue;
    }

    public void setItemValue(String itemValue) {
        this.itemValue = itemValue;
    }

    public String getItemCategory() {
        return itemCategory;
    }

    public void setItemCategory(String itemCategory) {
        this.itemCategory = itemCategory;
    }
}

Service實現層方法:
    public Integer submitItem(List<Item> list ){
        return researchMapper.submitItem(list);
    }

MyBatis的mapper配置檔案的語句(在Oracle資料中,多條資料之間用union all 連線,MySQL資料庫用,):
 <insert id="submitItem"  parameterType="java.util.List">
        insert into ITEM (
        ITEM_CODE,
        ITEM_NAME,
        ITEM_VALUE,
        ITEM_CATAGORY
        )
        select  item.* from
        (
        <foreach collection="list" item="item" index="index" separator="UNION ALL" >
            select
            #{item.itemCode,jdbcType=VARCHAR},
            #{item.itemName,jdbcType=VARCHAR},
            #{item.itemValue,jdbcType=VARCHAR},
            #{item.itemCategory,jdbcType=VARCHAR}
            from dual
        </foreach>
        ) item
    </insert>

<!--MySql寫法-->
<insert id="submitItem"  parameterType="java.util.List">
    insert into ITEM (
    ITEM_CODE,
    ITEM_NAME,
    ITEM_VALUE,
    ITEM_CATAGORY
    )
    values
    <foreach collection="list" item="item" index="index" separator="," >
      (
        #{item.itemCode,jdbcType=VARCHAR},
        #{item.itemName,jdbcType=VARCHAR},
        #{item.itemValue,jdbcType=VARCHAR},
        #{item.itemCategory,jdbcType=VARCHAR}
     )
    </foreach>
</insert>

foreach元素解析:

foreach元素是一個遍歷集合的迴圈語句,它支援遍歷陣列,List和Set介面的集合。

foreach元素中,collection是傳進來的引數名稱,可以是一個數組或者List、Set等集合;

                             item是迴圈中當前的元素(配置的item的名字隨意取,類似於iterator);

                             index是當前元素在集合中的位置下標;

                             seperator是各個元素的間隔符;

                             ()分別是open和close元素,表示用什麼符號將這些集合元素包裝起來。 


注意:由於一些資料庫的SQL對執行的SQL長度有限制,所以使用foreach元素的時候需要預估collection物件的長度;foreach除了用於本示例的迴圈插入,亦可用於構建in條件中(可自行嘗試)。