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的动态SQL语法foreach循环插入,待插入的实体bean的List通过查询数据库dual形成表。foreach的 separator 属性设置每次循环的隔离词为union连接每次形成的表为一个总表。 在总表中,条件匹配时,...
总的来说,MyBatis的`<foreach>`标签是处理动态SQL和集合数据的关键工具,它可以优雅地解决批量操作、条件查询等问题,让SQL语句的编写更加灵活和高效。正确理解和熟练运用`<foreach>`,能显著提升MyBatis的开发效率...
在Oracle数据库中使用MyBatis的`<foreach>`标签进行批量插入时,可能会遇到“SQL命令未正确结束”的错误。这个问题通常由于Oracle数据库对批量插入语句的语法要求与MySQL等其他数据库系统不同所导致。以下是对这个...
MyBatis foreach批量插入数据是一种高效的数据批量插入方式,通过foreach标签可以实现批量插入数据。但是,在不同的数据库管理系统中,foreach标签的使用有一些区别,今天我们主要介绍MyBatis foreach批量插入数据在...
本文将详细介绍如何使用Mybatis实现多表联合查询和批量插入。 一、多表联合查询 在实际开发中,经常需要对多个表进行联合查询,例如,查询员工信息同时需要关联部门信息和职位信息。Mybatis提供了强大的联合查询...
在开发过程中,应当加强对异常的捕获和处理,以便及时发现并解决问题。 #### 五、总结 通过上述分析,我们可以看出,在使用MyBatis的`foreach`语句处理集合数据时,正确的参数传递方式至关重要。遵循上述解决方案...
"Mybatis foreach标签带来的空格、换行、回车问题及解决方案" Mybatis 中的 foreach 标签是一个功能强大的工具,允许开发者在 SQL 语句中循环遍历集合对象。但是,在使用 foreach 标签时,经常会遇到空格、换行、...
"解决mybatis使用char类型字段查询oracle数据库时结果返回null问题" 在使用mybatis框架对Oracle数据库进行查询操作时,如果使用char类型字段作为查询条件,可能会出现结果返回null的问题。这种情况下,需要对char...
在批量插入场景下,JDBC提供了Statement对象的addBatch()和executeBatch()方法,可以将多条插入语句一次性提交,减少与数据库的交互次数,从而提高效率。 Mybatis是一个轻量级的持久层框架,它简化了JDBC的复杂性,...
这些方法接受一个实体对象列表,然后一次性将所有对象插入或更新到数据库。然而,当涉及到唯一索引时,简单的批量操作可能无法满足需求,因为可能会有重复的数据导致冲突。 在 Mybatis Plus 中自定义批量插入,我们...
在本文中,我们将深入探讨如何使用MyBatis直接执行SQL查询以及如何进行数据的批量插入。 **一、直接执行SQL查询** 在MyBatis中,你可以通过Mapper接口和XML配置文件来直接执行自定义的SQL查询。下面是一个简单的...
在Java开发中,MyBatis是一个非常流行的持久层框架,它简化了数据库操作,使得开发者可以更加专注于SQL语句的编写。本篇文章将详细介绍如何利用Java和MyBatis实现批量插入数据到Oracle数据库中。 首先,我们需要...
"mybatis连接MySQL8出现的问题解决方法" MyBatis是当前最流行的持久层框架之一,它提供了一个简单的方式来访问数据库。然而,在使用MyBatis连接MySQL8时,可能会出现一些问题。本文将介绍MyBatis连接MySQL8出现的...
在本示例中,我们将不使用Mapper接口来演示如何通过MyBatis进行基本的数据库查询,这对于理解MyBatis的核心工作原理是非常有帮助的。 首先,MyBatis的核心组件包括XML配置文件、SqlSessionFactory和SqlSession。XML...
Java实现使用Mybatis将数据批量插入到Oracle数据库,并且可以使用Oracle序列来生成主键
MyBatis批量插入是一种高效的数据插入方式,通过将多条数据一次性插入数据库,可以大大提高插入速度。在实际测试中,使用MyBatis批量插入可以达到至少快一倍的执行效率。 MyBatis批量插入的实现可以通过使用foreach...
对于一对多的插入操作,MyBatis提供了`collection`标签的`foreach`子标签,可以在插入用户的同时插入其关联的订单。例如,在`UserMapper.xml`中添加一个`insertUserWithOrders`方法: ```xml INSERT INTO users ...
本文将介绍如何使用 Spring Boot 和 MyBatis 配置 ClickHouse 实现插入查询功能。 一、添加 Maven 依赖 在使用 Spring Boot 和 MyBatis 配置 ClickHouse 之前,需要添加相应的 Maven 依赖。这些依赖包括 Spring ...
mybatis一对多的查询方法详解! mybatis一对多的查询方法详解! mybatis一对多的查询方法详解! mybatis一对多的查询方法详解!
在本示例中,"mybatis递归查询菜单树"是一个基于SpringBoot架构的应用,它演示了如何利用MyBatis进行递归查询来构建菜单树结构。此外,这个项目还集成了JTA(Java Transaction API)以支持分布式事务处理,并使用了...