mybatis insert foreach循环插入方式
作者:学亮编程手记 发布时间:2023-10-15 22:32:53
标签:mybatis,insert,foreach,循环
mybatis insert foreach循环插入
@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(实体类):
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条件中(可自行尝试)。
来源:https://zhangxueliang.blog.csdn.net/article/details/99718660


猜你喜欢
- 一、让ListView控件显示表头的方法在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Columns集
- 文件格式分别如下 package txtobject ReadTxt {def readFromTxtBy
- 本文接上文“java反射之方法反射的基本操作方法”,利用反射了解下java集合中泛型的本质1、初始化两个集合,一个使用泛型,一个不使用Arr
- 使用范围: 只能作用在方法和构造函数之上@SneakyThrows注解的作用得从java的异常设计体系说起。java中常见的异常有两种:Ex
- Kotlin 支持泛型, 语法和 Java 类似。例如,泛型类:class Hello<T>(val value: T)val
- 前言对于 InterruptedException,一种常见的处理方式是 “生吞(swallow)” 它 —— 捕捉它,然后什么也不做(或者
- 详解Kotlin的空指针处理Kotlin的空指针处理相比于java有着极大的提高,可以说是不用担心出现NullPointerExceptio
- Android Init进程对信号的处理流程在Android中,当一个进程退出(exit())时,会向它的父进程发送一个SIGC
- 在Android开发中很多时候会遇到一屏显示不下所有内容的现象,那大家也知道这个时候肯定会想到用scrollview来进行滚屏显示。这个时候
- 引入对于基本类型的常量或变量进行运算时,我们可以使用 +、-、*、/ 等运算符,但是我们不可以使用运算符来进行对象之间的运算。eg:对象之间
- 本文讲述绘制Android自定义各种图形效果,为自定义控件的入门篇 相关视频链接: Android自定义控件系列 http://edu.cs
- 1. pom.xml文件配置<?xml version="1.0" encoding="UTF-8&qu
- 当我们需要与 NIO Channel 进行交互时, 我们就需要使用到 NIO Buffer, 即数据从 Buffer读取到 Channel
- 一、采用Object.toString()toString方法是java.lang.Object对象的一个public方法。在java中任何
- 单元测试是程序员对代码的自测,一般公司都会严格要求单元测试,这是对自己代码的负责,也是对代码的敬畏。一般单元测试都是测试Service层,下
- 0.背景简介微软在 .NET 框架中提供了多种实用的线程同步手段,其中包括 monitor 类及 reader-writer锁。
- @Autowired注解在抽象类中失效最近在工作中遇到这个问题,在抽象类中使用Autowired这个注解,注入mybatis的dao时,总是
- 前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0
- SQLite 介绍SQLite,是一款轻型的数据库,用于本地的数据储存。先说说优点,它占用资源非常的低,在嵌入式设备中需要几百K的内存就够了
- 在软件开发过程中经常需要知道程序运行的大概时间,或者需要在规定时间内取数据,这是可以使用下面的方法获取时间段,还可以用在限时循环方法一:/*