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>
分享到:
相关推荐
Mybatis批量foreach merge into的用法,这是介绍Mybatis批量foreach merge into的用法的文档
测试mybatis里foreach用法,使用于list,array,map,怎么凑字数
本文给大家介绍Oracle+Mybatis的foreach insert批量插入报错的快速解决办法,非常不错,具有参考借鉴价值,感兴趣的朋友参考下吧
MyBatis中Foreach参数问题.doc
Java实现使用Mybatis将数据批量插入到Oracle数据库,并且可以使用Oracle序列来生成主键
主要介绍了mybatis使用char类型字段查询oracle数据库时结果返回null问题的解决方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
主要介绍了解决Mybatis中foreach标签带来的空格,换行,回车问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
Mybatis Plus 自定义批量插入或批量更新(根据唯一索引)
Mybatis与JDBC批量插入MySQL数据库性能测试,资源包含文档、代码和数据库。
mybatis一对多的查询方法详解! mybatis一对多的查询方法详解! mybatis一对多的查询方法详解! mybatis一对多的查询方法详解!
主要介绍了MyBatis的foreach语句详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
本博客有零基础入门MyBatis,欢迎关注本博客。
使用方法请看博客 https://blog.csdn.net/bandaotixiruiqiang/article/details/72478361#comments_12931827
mybatis简单使用mybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单使用demomybatis简单...
Mybatis框架(子查询)
Mybatis实现一对一,一对多数据插入数据实验报告
MyBatis高级映射(一对一查询)
Java开发系列MyBatis使用以及实现Java开发系列MyBatis使用以及实现Java开发系列MyBatis使用以及实现Java开发系列MyBatis使用以及实现Java开发系列MyBatis使用以及实现Java开发系列MyBatis使用以及实现Java开发系列...
文档中主要说明:(1)多表联合查询步骤,快捷便利;(2)数据批量插入,以及相关的案例,节省运行资源。
主要介绍了mybatis连接MySQL8出现的问题解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧