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>
分享到:
相关推荐
里面有mongodb和oracle的批处理入库,还有access数据库与java的链接,以及activeMQ的例子
探索者需要插件,批量插入计算书,很实惠,很实用的的插件!!!
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 ...
Net中批量插入的几种实现方法之间的比较:循环添加 每次1行 循环添加 每次1000行 SqlBulkCopy批量添加 表值参数批量添加
batchInsert 条件查询返回一个 selectFirstByExample 核心特性 按照界面步骤轻松生成代码,省去XML繁琐的学习与配置过程 保存数据库连接与Generator配置,每次代码生成轻松搞定 内置常用插件,比如分页插件 支持Over...
BatchInsertAndUpdate Test SqlBulkCopy Enterprise Lib SqlDataAdapter
收集的MySQL_DBA面试题,挣点积分,欢迎各位大佬下载~~~
mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁) 1、mybatis批处理 2、数据分批量查询 3、数据分批量插入
封装SqlHelper,普通野,个个都有,个个都可以用,唔知岩唔岩的。
源代码,springboot+mybatis 分析对比批量数据插入数据的性能对比
批量插入: 界面:BatchInsert 用法:java BatchInsert DATAFILENAME COLUMNDBNAME COLUMNARFILENAME NUMCOLUMNS 示例:java BatchInsert sampledata.txt testColumnDB学生4 创建索引: 界面:CreateIndex 用法:...
本文实例讲述了yii2.0框架数据库操作。分享给大家供大家参考,具体如下: 添加 $id = \Yii::$app->db ->createCommand() ...Yii::$app->db->createCommand()->batchInsert('user', ['name', 'age'], [ ['To
MybatisPlus自带的批量插入说白了就是for循环一条一条插入,我重新弄了一个
将选项spring.jpa.properties.hibernate.jdbc.batch_size设置为所需的值。 将您的saveAll()方法与准备插入的实体列表一起使用。 运行此应用程序,然后查看日志: 2018-06-16 00:23:14.698 INFO 9128 --- [ main]...
增加batchInsert方法,批量插入。(参考:BatchInsertPlugin) 增加where语句增强,用于在where条件后追加类似:is_deleted='n'的语句(参考:AssistPlugin) insert和insertSelective方法添加useGeneratedKeys=...
本文实例讲述了Yii框架批量插入数据扩展类的简单实现方法。分享给大家供大家参考,具体如下: MySQL INSERT语句允许插入多行数据,如下所示: ... * class for sql batch insert */ class CDbBIComm
clickhouze 天真的Clickhouse客户端 安装 npm i clickhouze 用法 const client = require ( 'clickhouze' ) ( { host : '127.0.0.1' , port : 8123 , } ) ... batchInsert ( 'events' , [ { a :
mybatis-plus_batch_insert:mybatis_plus添加批量插入
需求场景 项目开发过程中,某个功能需要大量的数据支撑我们验证功能的逻辑性能,测试完成之后我们...create procedure batchInsert() begin declare i int default 0; set i=0; start transaction; while i<80000 do
跨经 该存储库包含上组件的示例项目(此存储库主要包含项目)。 Transwarp的Apache Hadoop for ...BatchInsert。 Inceptor JDBC批量插入数据的示例。 Kerberos支持 ComplexSearch。 通过Inceptor JDBC(由Elasti