最近在做将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>`标签进行批量插入时,可能会遇到“SQL命令未正确结束”的错误。这个问题通常由于Oracle数据库对批量插入语句的语法要求与MySQL等其他数据库系统不同所导致。以下是对这个...
在Java开发中,MyBatis是一个非常流行的持久层框架,它简化...总之,Java结合MyBatis实现批量插入Oracle数据库,不仅可以提高效率,还能让代码更简洁易维护。通过合理配置和优化,可以更好地满足大规模数据处理的需求。
Mybatis批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不存在则插入。下面是该方法的详细介绍: ...
MyBatis foreach批量插入数据:Oracle与MySQL区别介绍 MyBatis foreach批量插入数据是一种高效的数据批量插入方式,通过foreach标签可以实现批量插入数据。但是,在不同的数据库管理系统中,foreach标签的使用有...
本文将详细探讨如何在Oracle数据库中进行批量插入优化,并介绍MyBatis Generator这一自动化代码生成工具,以提高开发效率。 首先,让我们深入理解Oracle数据库中的批量插入。批量插入可以显著提升性能,尤其是在...
MyBatis动态SQL和批量插入的应用 MyBatis是一款功能强大且灵活的持久层框架,提供了多种方式来对数据库进行交互。其中,动态SQL是一种非常强大的特性,能够根据不同的条件生成不同的SQL语句。下面将详细介绍MyBatis...
总的来说,MyBatis的批量插入功能结合了Java代码的灵活性和SQL的高效性,是处理大批量数据插入的理想选择。通过理解并熟练运用`<foreach>`标签和`<selectKey>`标签,开发者可以轻松地在项目中实现批量插入操作。
在Java开发中,MyBatis框架与Oracle数据库结合进行批量数据导入时,可能会遇到一些问题。本文将详细探讨这些问题,并提供一种可行的解决方案。 首先,批量插入操作在DAO层,我们定义了一个`insertList`方法,它接收...
在MyBatis中,可以使用INSERT ALL语句来批量插入数据到Oracle数据库。以下是示例代码: ```xml <insert id="addList" parameterType="java.util.List" useGeneratedKeys="false"> INSERT ALL <foreach item="item...
在 Mybatis 中,要实现插入一条或批量插入,需要使用 `<insert>` element,并在其中使用 `useGeneratedKeys` 和 `keyProperty` 属性来获取自增长主键。 MySQL 在 MySQL 中,需要使用 `useGeneratedKeys="true"` 和...
总结来说,MyBatis 通过`foreach` 标签和`ExecutorType.BATCH` 提供了灵活且高效的批量插入机制。`foreach` 适用于构建动态SQL,处理`IN`条件;而`ExecutorType.BATCH` 优化了批量插入的性能,通过调整提交频率和...
首先,我们看到一个关键的MyBatis XML映射文件中的`<insert>`标签,用于批量插入数据。这个`<insert>`标签内包含了一个`<![CDATA[...]]>`结构,这是为了防止SQL语句中的特殊字符(如 `>` 和 `)被XML解析器误解析。...
在Mybatis中,批量插入数据可以通过使用foreach语句来实现,而返回主键可以通过使用useGeneratedKeys和keyProperty两个属性来实现。下面是一个示例代码: 首先,在持久层的Mapper文件中,我们需要定义一个批量插入...
本篇文章重点讨论如何在Oracle数据库环境下,利用MyBatis进行批量插入、更新和删除操作,这有助于提高数据库操作的效率,减少资源消耗。 批量操作在处理大量数据时尤其重要,因为单条记录的事务提交会消耗更多的...
Oracle通常使用子查询结合`UNION ALL`操作来实现批量插入。在Mybatis映射文件中,这样的配置是这样的: ```xml <insert id="insertBatchForOracle" parameterType="java.util.List"> insert command_content...
使用 Spring 框架结合 MyBatis 框架,可以实现高效的批量插入操作。本文将详细介绍 Spring 中使用 MyBatis 实现批量插入的示例代码,主要分为三种实现方式:foreach、Spring 事务、ExecutorType.BATCH。 二、...
本文将详细讲解如何使用MyBatis的注解方式在MySQL和Oracle数据库上实现批量处理,旨在提高数据操作的效率。 首先,我们要理解MyBatis的核心原理,它是一个基于Java的持久层框架,通过XML或注解来映射SQL语句,简化...
* 高效:MyBatis 动态插入 List 可以大大提高批量插入数据的效率。 * 灵活:MyBatis 动态插入 List 可以根据实际情况灵活地处理不同的数据。 * 简洁:MyBatis 动态插入 List 的语法简洁易懂,易于维护和维护。 ...