mybatis insert foreach循環插入
1
2
3
4
5
6
7
8
|
@ Insert ( "<script>" + "insert into driver_account_appeal_photo (appeal_id,appeal_photo_path) values\n" + "<foreach collection=\"photoList\" item=\"item\" index=\"index\" separator=\",\">\n" + "\t(#{appealId},#{item})\n" + "</foreach>" + "</script>" ) //@ Insert ( "insert into driver_account_appeal_photo (appeal_id,appeal_photo_path) values(#{appealId},#{appealPhotoPath})" ) void addAppealPhoto(AppealPhoto appealPhoto); |
foreach語句批量插入數據
本例技術:Spring+SpringMVC+MyBatis+Oracle
問題描述:
需要將程序里的一個集合保存到數據庫里,集合的類型對應數據庫的一個實體,若在程序里遍歷集合再一條條保存到數據庫表中有點麻煩,這里可以利用MyBatis 的 foreach語句實現批量插入數據。
核心代碼清單:
Item(實體類):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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實現層方法:
1
2
3
|
public Integer submitItem(List<Item> list ){ return researchMapper.submitItem(list); } |
MyBatis的mapper配置文件的語句
在Oracle數據中,多條數據之間用union all 連接,MySQL數據庫用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
< 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 > |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<! --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條件中(可自行嘗試)。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://zhangxueliang.blog.csdn.net/article/details/99718660