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
查看更多关于mybatis insert foreach循环插入方式的详细内容...