oracle的批量插入方式是:
insert into db(id, zgbh, shbzh)
select '1', '2', '3' from dual
union all select '2', '3', '4' from dual
union all select '3', '4', '5' from dual
union all select '4', '5', '6' from dual
union all select '5', '6', '7' from dual
由于项目使用到sequence生成id,刚开始的写法:
<!-- 批次插入,List-->
<insert id="insertList" useGeneratedKeys="true" parameterType="java.util.List">
<selectKey resultType="long" keyProperty="id" order="BEFORE">
SELECT SEQ_xxx_DETAIL.NEXTVAL FROM DUAL
</selectKey>
insert into TBL_xxx_DETAIL
(
<include refid="allColumns"/>
)
<foreach collection="list" item="item" index="index" separator="UNION ALL" >
SELECT
#{id, jdbcType=NUMERIC javaType=long},
#{item.batchFundTitleId, jdbcType=NUMERIC javaType=long},
#{item.transactionRequestId, jdbcType=NUMERIC javaType=long},
#{item.arAmt, jdbcType=DECIMAL javaType=java.math.BigDecimal},
#{item.bankServiceAmt, jdbcType=DECIMAL javaType=java.math.BigDecimal},
#{item.receivedAmt, jdbcType=DECIMAL javaType=java.math.BigDecimal},
#{item.realReceivedAmt, jdbcType=DECIMAL javaType=java.math.BigDecimal},
#{item.verifyDate, jdbcType=DATE javaType=date},
#{item.verifyOp, jdbcType=VARCHAR javaType=string},
#{item.verifyStatus, jdbcType=INTEGER javaType=int},
#{item.created, jdbcType=VARCHAR javaType=string},
#{item.createdDate, jdbcType=DATE javaType=date},
#{item.createdIp, jdbcType=VARCHAR javaType=string},
#{item.modified, jdbcType=VARCHAR javaType=string},
#{item.modifiedDate, jdbcType=DATE javaType=date},
#{item.modifiedIp, jdbcType=VARCHAR javaType=string}
from dual
</foreach>
</insert>
这样的写法sequence的查询方法只查询一次,造成list中的对象的再插入时id都会一样,违反主键的唯一性约束。
所以修改为如下的形式:
<insert id="insertList" useGeneratedKeys="true" parameterType="java.util.List">
<selectKey resultType="long" keyProperty="id" order="BEFORE">
SELECT SEQ_xxx_DETAIL.NEXTVAL FROM DUAL
</selectKey>
insert into TBL_xxx_DETAIL
(
<include refid="allColumns"/>
) select SEQ_xxx_DETAIL.NEXTVAL,A.* from(
<foreach collection="list" item="item" index="index" separator="UNION ALL" >
SELECT
#{item.batchFundTitleId, jdbcType=NUMERIC javaType=long},
#{item.transactionRequestId, jdbcType=NUMERIC javaType=long},
#{item.arAmt, jdbcType=DECIMAL javaType=java.math.BigDecimal},
#{item.bankServiceAmt, jdbcType=DECIMAL javaType=java.math.BigDecimal},
#{item.receivedAmt, jdbcType=DECIMAL javaType=java.math.BigDecimal},
#{item.realReceivedAmt, jdbcType=DECIMAL javaType=java.math.BigDecimal},
#{item.verifyDate, jdbcType=DATE javaType=date},
#{item.verifyOp, jdbcType=VARCHAR javaType=string},
#{item.verifyStatus, jdbcType=INTEGER javaType=int},
#{item.created, jdbcType=VARCHAR javaType=string},
#{item.createdDate, jdbcType=DATE javaType=date},
#{item.createdIp, jdbcType=VARCHAR javaType=string},
#{item.modified, jdbcType=VARCHAR javaType=string},
#{item.modifiedDate, jdbcType=DATE javaType=date},
#{item.modifiedIp, jdbcType=VARCHAR javaType=string}
from dual
</foreach>) A
</insert>
把foreach中的id去掉,foreach拼出来的数据作为一张表A,然后从表A中查询数据,再接上从sequence中读取的值作为id。这样sequence的值就会多次读取,id就会不一样。
<selectKey resultType="long" keyProperty="id" order="BEFORE">
SELECT SEQ_xxx_DETAIL.NEXTVAL FROM DUAL
</selectKey>删除后会报错:SQL command not properly ended,暂时没有查出来原因,有知道的原因的请告诉我哈。
以此文抛砖引玉吧,希望能有更合适的方式。
mysql的批量插入如下:
INSERT INTO MyTable(ID,NAME) VALUES(7,'003'),(8,'004'),(9,'005')
而且mysql有自增字段,可以把id设置为自增的,这样的话就不存在id一致的情况。
<insert id="insertBatch" >
insert into student ( NAME,SEX,ADDRESS,TELEPHONE,TID)
values
<foreach collection="list" item="item" index="index" open="(" separator="," close=")">
#{item.name},
#{item.sex},
#{item.address},
#{item.telephone},
#{item.tId}
</foreach>
</insert>
<!-- insert batch -->
<insert id="insertBatch" parameterType="list">
<selectKey resultType="Long" order="BEFORE" keyProperty="id">
SELECT NEXTVAL ('crm.merchant_id_seq') as id
</selectKey>
<foreach collection="mchts" item="item" index="index" separator=";" >
insert into crm.merchant (id,city_id, full_name,
address, contactor_name, contactor_mobile,
latitude, longitude, geohash,
bussiness_phone, tel_voucher, business_hours,
author_uid, status, source)
SELECT
#{id,jdbcType=BIGINT},
#{item.cityId,jdbcType=SMALLINT},
#{item.fullName,jdbcType=VARCHAR},
#{item.address,jdbcType=VARCHAR},
#{item.contactorName,jdbcType=VARCHAR},
#{item.contactorMobile,jdbcType=VARCHAR},
#{item.latitude,jdbcType=NUMERIC},
#{item.longitude,jdbcType=NUMERIC},
#{item.geohash,jdbcType=VARCHAR},
#{item.bussinessPhone,jdbcType=VARCHAR},
#{item.telVoucher,jdbcType=VARCHAR},
#{item.businessHours,jdbcType=VARCHAR},
#{item.authorUid,jdbcType=INTEGER},
#{item.status,jdbcType=BIT},
#{item.source,jdbcType=SMALLINT}
</foreach>
</insert>
分享到:
相关推荐
探索者需要插件,批量插入计算书,很实惠,很实用的的插件!!!
1. MongoDB批量Insert操作: MongoDB是一个NoSQL数据库,以JSON格式的文档存储数据。批量插入可以使用`insertMany()`方法,它接受一个文档数组作为参数。例如,在Java中,我们可以创建一个`Document`对象数组,然后...
在IT领域,数据库操作是日常开发中的重要环节,特别是在处理大量数据时,高效的批量插入(Batch Insert)和更新(Batch Update)技术显得尤为关键。"BatchInsertAndUpdate Test"这个项目显然是针对这一需求进行的...
context.BulkInsert(entitiesList, options => options.BatchSize = 1000); ``` 5. **注意事项**: - 批量插入可能不适用于那些需要事务控制的场景,因为一旦开始批量插入,所有操作将作为一个单元进行,如果...
CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int default 1; start TRANSACTION; while i <= args DO insert into A_student(id,name) VALUES (i, concat(“陈瓜皮-”, i)); set i = i+1; end ...
例如,你可以创建一个数据库连接,打开事务,然后遍历数据集,对每一行执行INSERT语句。但这种方式的缺点在于,当数据量大时,频繁的网络往返和数据库操作会导致性能急剧下降。 第二种方式是在循环中增加批量处理,...
batchInsert 条件查询返回一个 selectFirstByExample 核心特性 按照界面步骤轻松生成代码,省去XML繁琐的学习与配置过程 保存数据库连接与Generator配置,每次代码生成轻松搞定 内置常用插件,比如分页插件 支持Over...
Mybatis Plus 提供了 `batchInsert()` 和 `batchUpdate()` 方法来实现批量插入和更新。这些方法接受一个实体对象列表,然后一次性将所有对象插入或更新到数据库。然而,当涉及到唯一索引时,简单的批量操作可能无法...
在处理大量数据时,批量插入(Batch Insert)是一种非常有效的方法,可以显著提高数据库操作的效率。本篇文章将详细介绍如何在 MyBatis-Plus 中实现批量插入。 ### 1. MyBatis-Plus 简介 MyBatis-Plus 是 MyBatis ...
在数据库操作中,批量插入(Batch Insert)是一种提高性能的有效方式,尤其是在处理大量数据时。本文将探讨Mybatis和JDBC在批量插入MySQL数据库时的性能差异,并提供相关的测试资源。 首先,JDBC(Java Database ...
通过 `batchInsert(List)` 方法可以实现批量插入,将多条数据一次性提交,减少了数据库交互次数,提高了性能。这是处理大批量数据时常用的手段。 3. **多线程批量插入(Multi-thread Batch Insert)** 在大数据量...
MySQL数据库管理员(DBA)面试题通常涵盖广泛的领域,包括但不限于数据库架构、存储引擎特性、内存管理、事务处理、数据类型、备份与恢复策略以及复制技术等。以下是对这些知识点的详细解释: 1. **MySQL 架构体系**...
1. **单个插入循环**:在这种方法中,开发者通常会在一个循环中调用`insert()`方法,为每条数据执行一次SQL插入语句。虽然这种方式简单易懂,但当数据量增大时,频繁的数据库交互会带来性能瓶颈。 2. **批处理...
4. 最后,在Controller层或其他业务逻辑中调用`batchInsert`方法,传入包含多个User对象的列表,完成批量插入。 为了优化性能,还可以调整Oracle数据库的设置,例如增大批处理大小、禁用 autocommit 等。同时,注意...
在IT行业中,数据库操作是应用开发中的重要环节,特别是在大数据量的情况下,如何高效地进行数据插入成为了一个关键问题。MyBatis,作为一个优秀的Java持久层框架,提供了多种优化手段,其中包括多线程和批处理技术...
批量插入(Batch Insert)是提高数据导入效率的重要手段,尤其在需要处理大量数据时,能显著减少网络通信和数据库调用次数,从而提升性能。 以下是对"Oracle OCI 批量插入源代码"的详细说明: 1. **oci_batch_...
使用SpringBoot-JPA进行自定义...在上面的例子中,我们使用了batchInsert()方法来批量保存10个StudentDO对象。 使用SpringBoot-JPA进行自定义保存及批量保存功能可以简化数据访问层的开发,并提供了许多有用的功能。
封装SqlHelper,普通野,个个都有,个个都可以用,唔知岩唔岩的。
<insert id="batchInsert" parameterType="java.util.List"> INSERT INTO table_name (column1, column2) VALUES ,"> (#{item.column1}, #{item.column2}) </insert> ``` 批量查找则涉及优化查询,如使用`IN`...
客户端可以通过表单提交或者Ajax请求调用`batchInsert`动作,传递数据列表。表单提交时,数据可以被Struts2的表单绑定机制自动封装到`dataList`中。 在实际开发中,我们可能会遇到性能优化的问题。例如,当数据量...