MyBatis foreach語句批量插入資料
阿新 • • 發佈:2019-02-20
本例技術: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條件中(可自行嘗試)。