`
郑云飞
  • 浏览: 808878 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mybatis结合Oracle的foreach insert批量插入

 
阅读更多

最近在做将mysql数据库项目迁移到oracle数据库项目中,发现某些sql存在不兼容的情况,比如批量插入在mysql中写法如下,mybatis配置文件

xxxMapper.xml文件:

 

	<insert id="batchInsert" parameterType="List">
		INSERT INTO USER_ANSWER (
			USER_ANSWER_ID,USER_SERVEY_ID,QUESTION_ID,OPTION_ID,ADD_DATE
		)
		VALUES
		<foreach collection="list" item="record" index="index" separator=",">
			(#{record.USER_ANSWER_ID}, #{record.USER_SERVEY_ID}, #{record.QUESTION_ID}, #{record.OPTION_ID}, #{record.ADD_DATE})
		</foreach>
	</insert>

 

 

        但是运行起来后就一直报错,报错信息如下:

 

### SQL: INSERT INTO USER_ANSWER (    USER_ANSWER_ID,USER_SERVEY_ID,QUESTION_ID,OPTION_ID,ADD_DATE   )   VALUES         (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)    ,     (?, ?, ?, ?, ?)
### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束

; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束
] with root cause
java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束

 

        把SQL复制出来在PL/SQL中运行也是报同样的错,如上也可以看出,使用批量插入执行的SQL语句等价于:

 INSERT INTO USER_ANSWER (
USER_ANSWER_ID,USER_SERVEY_ID,QUESTION_ID,OPTION_ID,ADD_DATE
)VALUES (?,?,?,?,?),(?,?,?,?,?)

 而在oracle中用insert into xxx values (xxx,xxx),(xxx,xxx) 这种语法是通不过的 。

发现这只适用于MySQL,不适用于Oracle,因此把xml文件修改一下:

	<insert id="batchInsert" parameterType="List">
		INSERT INTO USER_ANSWER (
			USER_ANSWER_ID,USER_SERVEY_ID,QUESTION_ID,OPTION_ID,ADD_DATE
		)
		SELECT A.*
		FROM (
			<foreach collection="list" item="record" index="index" separator="UNION ALL">
				SELECT
				#{record.USER_ANSWER_ID}, #{record.USER_SERVEY_ID}, #{record.QUESTION_ID}, #{record.OPTION_ID},
				#{record.ADD_DATE}
				FROM dual
			</foreach>
		)A
	</insert>

 

        运行通过。在Oracle的版本中,有几点需要注意的:

        1.SQL中没有VALUES;

        2.<foreach>标签中的(selece ..... from dual);

        3.<foreach>标签中的separator的属性为"UNION ALL",将查询合并结果集。

分享到:
评论

相关推荐

    Oracle+Mybatis的foreach insert批量插入报错的快速解决办法

    在Oracle数据库中使用MyBatis的`&lt;foreach&gt;`标签进行批量插入时,可能会遇到“SQL命令未正确结束”的错误。这个问题通常由于Oracle数据库对批量插入语句的语法要求与MySQL等其他数据库系统不同所导致。以下是对这个...

    Java实现mybatis批量插入数据到Oracle

    在Java开发中,MyBatis是一个非常流行的持久层框架,它简化...总之,Java结合MyBatis实现批量插入Oracle数据库,不仅可以提高效率,还能让代码更简洁易维护。通过合理配置和优化,可以更好地满足大规模数据处理的需求。

    Mybatis批量foreach merge into的用法

    Mybatis批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不存在则插入。下面是该方法的详细介绍: ...

    mybatis的oracle的批量插入优化和mybatis的generator自动生成三层文件

    本文将详细探讨如何在Oracle数据库中进行批量插入优化,并介绍MyBatis Generator这一自动化代码生成工具,以提高开发效率。 首先,让我们深入理解Oracle数据库中的批量插入。批量插入可以显著提升性能,尤其是在...

    MyBatis动态SQL,MyBatis批量插入(Oracle数据库)[收集].pdf

    MyBatis动态SQL和批量插入的应用 MyBatis是一款功能强大且灵活的持久层框架,提供了多种方式来对数据库进行交互。其中,动态SQL是一种非常强大的特性,能够根据不同的条件生成不同的SQL语句。下面将详细介绍MyBatis...

    MyBatis批量插入(insert)数据操作

    总的来说,MyBatis的批量插入功能结合了Java代码的灵活性和SQL的高效性,是处理大批量数据插入的理想选择。通过理解并熟练运用`&lt;foreach&gt;`标签和`&lt;selectKey&gt;`标签,开发者可以轻松地在项目中实现批量插入操作。

    mybatis foreach批量插入数据:Oracle与MySQL区别介绍

    MyBatis foreach批量插入数据:Oracle与MySQL区别介绍 MyBatis foreach批量插入数据是一种高效的数据批量插入方式,通过foreach标签可以实现批量插入数据。但是,在不同的数据库管理系统中,foreach标签的使用有...

    mybatis+Oracle做批量导入时的坑

    在Java开发中,MyBatis框架与Oracle数据库结合进行批量数据导入时,可能会遇到一些问题。本文将详细探讨这些问题,并提供一种可行的解决方案。 首先,批量插入操作在DAO层,我们定义了一个`insertList`方法,它接收...

    Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例

    在 Mybatis 中,要实现插入一条或批量插入,需要使用 `&lt;insert&gt;` element,并在其中使用 `useGeneratedKeys` 和 `keyProperty` 属性来获取自增长主键。 MySQL 在 MySQL 中,需要使用 `useGeneratedKeys="true"` 和...

    MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)

    在MyBatis中,可以使用INSERT ALL语句来批量插入数据到Oracle数据库。以下是示例代码: ```xml &lt;insert id="addList" parameterType="java.util.List" useGeneratedKeys="false"&gt; INSERT ALL &lt;foreach item="item...

    oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert

    首先,我们看到一个关键的MyBatis XML映射文件中的`&lt;insert&gt;`标签,用于批量插入数据。这个`&lt;insert&gt;`标签内包含了一个`&lt;![CDATA[...]]&gt;`结构,这是为了防止SQL语句中的特殊字符(如 `&gt;` 和 `)被XML解析器误解析。...

    mybatis中批量插入的两种方式(高效插入)

    总结来说,MyBatis 通过`foreach` 标签和`ExecutorType.BATCH` 提供了灵活且高效的批量插入机制。`foreach` 适用于构建动态SQL,处理`IN`条件;而`ExecutorType.BATCH` 优化了批量插入的性能,通过调整提交频率和...

    Mybatis批量插入数据返回主键的实现

    在Mybatis中,批量插入数据可以通过使用foreach语句来实现,而返回主键可以通过使用useGeneratedKeys和keyProperty两个属性来实现。下面是一个示例代码: 首先,在持久层的Mapper文件中,我们需要定义一个批量插入...

    Oracle + Mybatis实现批量插入、更新和删除示例代码

    本篇文章重点讨论如何在Oracle数据库环境下,利用MyBatis进行批量插入、更新和删除操作,这有助于提高数据库操作的效率,减少资源消耗。 批量操作在处理大量数据时尤其重要,因为单条记录的事务提交会消耗更多的...

    mybatis批量添加实现1

    Oracle通常使用子查询结合`UNION ALL`操作来实现批量插入。在Mybatis映射文件中,这样的配置是这样的: ```xml &lt;insert id="insertBatchForOracle" parameterType="java.util.List"&gt; insert command_content...

    spring中使用mybatis实现批量插入的示例代码

    使用 Spring 框架结合 MyBatis 框架,可以实现高效的批量插入操作。本文将详细介绍 Spring 中使用 MyBatis 实现批量插入的示例代码,主要分为三种实现方式:foreach、Spring 事务、ExecutorType.BATCH。 二、...

    mybatis使用annotation在mysql,oracle上进行批量处理

    本文将详细讲解如何使用MyBatis的注解方式在MySQL和Oracle数据库上实现批量处理,旨在提高数据操作的效率。 首先,我们要理解MyBatis的核心原理,它是一个基于Java的持久层框架,通过XML或注解来映射SQL语句,简化...

    Mybatis.docx

    通过 `&lt;sql&gt;` 标签可以实现 SQL 语句的复用,`&lt;select&gt;`, `&lt;insert&gt;`, `&lt;update&gt;`, `&lt;delete&gt;` 标签分别对应 SQL 的查询、插入、更新和删除操作。 - `Mapper.java` 接口:与 `Mapper.xml` 文件相对应,定义了方法,...

Global site tag (gtag.js) - Google Analytics