mybatis使用foreach进行批量插入

2023-12-03

我正在使用 mybatis,我想将 ArrayList 插入到某个表中。
好吧,在映射器中使用 foreach ,这最终会导致 Oracle 异常 ORA_00933 。
这是 mybatis 映射器:

<insert id="batchInsert" parameterType="java.util.List">
		insert into SYS_ROLES_PERMISSIONGROUP
		(role_id, permissiongroup_id)
		values
		<foreach collection="list" item="model" index="index" separator=","> 
        (#{model.role_id}, #{model.permissiongroup_id})
    	</foreach>
	</insert>

org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束

### The error may involve com.gaotime.platform.system.mapper.RolePermissiongroupMapper.batchInsert-Inline
### The error occurred while setting parameters
### SQL: insert into SYS_ROLES_PERMISSIONGROUP   (role_id, permissiongroup_id)   values               (?, ?)      ,           (?, ?)      ,           (?, ?)
### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束

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

	at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:95)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:71)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:364)
	at com.sun.proxy.$Proxy5.insert(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:236)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:51)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)
	at com.sun.proxy.$Proxy15.batchInsert(Unknown Source)
	at com.gaotime.platform.system.service.RolePermissiongroupService.batchInsert(RolePermissiongroupService.java:18)
	at com.gaotime.platform.system.action.RolePermissiongroupAction.execute(RolePermissiongroupAction.java:54)
	at com.gaotime.platform.handler.MqMessageHandler.handle(MqMessageHandler.java:20)
	at unitask.ums.activemq.HandlerThread.run(HandlerThread.java:51)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束

	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
	at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
	at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
	at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
	at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
	at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1008)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
	at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3550)
	at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1374)
	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.execute(NewProxyPreparedStatement.java:989)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:62)
	at com.sun.proxy.$Proxy27.execute(Unknown Source)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:44)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:69)
	at org.apache.ibatis.executor.ReuseExecutor.doUpdate(ReuseExecutor.java:50)
	at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:105)
	at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:71)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:152)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:141)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:354)
Please help me out, thanks

多一个映射器配置

<insert id="batchInsert" parameterType="java.util.List">
	    <foreach collection="list" item="model" index="index" separator=","> 
		insert into SYS_ROLES_PERMISSIONGROUP
		(role_id, permissiongroup_id)
		values
		
        (#{model.role_id}, #{model.permissiongroup_id})
    	</foreach>
	</insert>
I got this message

org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束

### The error may involve com.gaotime.platform.system.mapper.RolePermissiongroupMapper.batchInsert-Inline
### The error occurred while setting parameters
### SQL: insert into SYS_ROLES_PERMISSIONGROUP   (role_id, permissiongroup_id)   values            (?, ?)       ,     insert into SYS_ROLES_PERMISSIONGROUP   (role_id, permissiongroup_id)   values            (?, ?)       ,     insert into SYS_ROLES_PERMISSIONGROUP   (role_id, permissiongroup_id)   values            (?, ?)
### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束

; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束
here is the static insert statement

<insert id="batchInsert" parameterType="java.util.List">
	    <!-- <foreach collection="list" item="model" index="index" separator=";"> 
		insert into SYS_ROLES_PERMISSIONGROUP
		(role_id, permissiongroup_id)
		values
		
        (#{model.role_id,jdbcType=NUMERIC}, #{model.permissiongroup_id,jdbcType=NUMERIC})
    	</foreach> -->
    	insert into SYS_ROLES_PERMISSIONGROUP
		(role_id, permissiongroup_id)
		values(5,5);
		insert into SYS_ROLES_PERMISSIONGROUP
		(role_id, permissiongroup_id)
		values(6,6)
	</insert>
and the exception

19:00:21,531 DEBUG Thread-11 RolePermissiongroupMapper.batchInsert:139 - ==>  Preparing: insert into SYS_ROLES_PERMISSIONGROUP (role_id, permissiongroup_id) values(5,5); insert into SYS_ROLES_PERMISSIONGROUP (role_id, permissiongroup_id) values(6,6) 
19:00:21,535 DEBUG Thread-11 RolePermissiongroupMapper.batchInsert:139 - ==> Parameters: 
19:00:21,553 DEBUG Thread-11 impl.NewPooledConnection:430 - com.mchange.v2.c3p0.impl.NewPooledConnection@699238ad handling a throwable.
java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
For update, I still need help. Come over google group

InsertMybatis 内部foreach不是批次,这是一个单一的(可能会变得巨大的)SQL 语句,并且带来了缺点:

  • 有些数据库比如Oracle这里不支持。
  • 在相关情况下:将需要插入大量记录,并且将达到数据库配置的限制(默认情况下每个语句大约 2000 个参数),如果语句本身变得太大,最终可能会出现数据库堆栈错误。

不得在 mybatis XML 中对集合进行迭代。 只需执行一个简单的Insert中的声明Java foreach loop. 最重要的是会话执行者类型.

SqlSession session = sessionFactory.openSession(ExecutorType.BATCH);
for (Model model : list) {
    session.insert("insertStatement", model);
}
session.flushStatements();

我认为在这里就足够使用执行器类型.REUSE没有冲洗语句。

与默认不同执行器类型.SIMPLE,该语句将准备一次并为每个要插入的记录执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis使用foreach进行批量插入 的相关文章

  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • 如何更新 pl/sql 中嵌套表的列? [复制]

    这个问题在这里已经有答案了 我正在尝试在表中创建一个可以存储多个值的列 如下所示 我有一个学生id std和一个名为marks可以采用几个值 例如2 3 4 我想更新此列表以添加另一个标记2 3 4 5但我不知道怎么做 我如何更新专栏mar
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 在另一个模块中使用自定义 gradle 插件模块

    我正在开发一个自定义插件 我希望能够在稍后阶段将其部署到存储库 因此我为其创建了一个独立的模块 在对其进行任何正式的 TDD 之前 我想手动进行某些探索性测试 因此 我创建了一个使用给定插件的演示模块 到目前为止 我发现执行此操作的唯一方法
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio

随机推荐

  • 创建唯一的随机数

    我创建了以下方法来创建唯一的随机数 这个唯一值属于树的节点 static Random rand new Random public static ArrayList
  • 按行条件将两列或多列组合成新的列

    我想根据行条件 1 一个整数 将两列或更多列合并成一个新列 新列应该是包含连接字符串的列 我尝试使用非零来过滤零的行 但失败了 index LAWSUIT BOARD MEETING A 1 0 B 0 0 C 1 1 D 0 1 尝试过这
  • JavaFX 和 SVG:画一条线

    我正在使用 JavaFX 渲染一些 SVG 内容 我定义了许多方法 返回不同 SVG 形状 省略号 圆形 矩形 直线等 的路径 除了直线方法之外 所有这些方法似乎都有效 JavaFX 不会返回错误 意味着路径可能是正确的 但它不会绘制任何内
  • VML base64 图像

    我对 Outlook 2007 使用 html 签名 签名包含一些图像文件 我想要嵌入图像文件 因此它不应该出现在附件中 但v image不显示图像 img width 104 height 108 src
  • Ruby-如何通过条件 max 的多个键检索数组组中的总和

    原始数组是 id gt 2 idx gt 111 money gt 4 00 money1 gt 1 00 order gt 001 order1 gt 1 id gt 1 idx gt 112 money gt 2 00 money1 g
  • 在 Spring Boot 中注册自定义 MessageConverter

    我想使用返回的 RESTful 服务text javascript内容类型 由于没有 OOTBHttpMessageConverter可以在 Spring Boot 中执行此操作 我想注册一个自定义转换器 我发现做到这一点的一种方法是自定义
  • Django 中的多态性

    我有以下型号 我如何访问unicode实体表的继承表 Team 和 Athete 的数量 我正在尝试显示所有实体的列表 如果是团队 则显示 名称 如果是运动员 则显示 名字 和 姓氏 class Entity models Model en
  • 当软件键盘显示/隐藏时如何收到通知?

    有没有办法在键盘即将显示或已经显示时收到通知 以下活动将会很棒 键盘将显示 键盘显示 键盘将隐藏 键盘隐藏 唯一的方法是覆盖View s onSizeChanged 方法 请参阅 Android 开发者组中的此主题 http groups
  • 如何确定枚举值所代表的类型?

    考虑以下两个枚举 enum MyEnum1 Value1 1 Value2 2 Value3 3 enum MyEnum2 Value1 a Value2 b Value3 c 我可以通过显式转换检索这些枚举值表示的物理值 int MyEn
  • 如何将“使用命名空间”传递给正在调用函数的启动线程作业?

    问题 我有一个使用 Start ThreadJob 调用的函数 该函数需要以下命名空间才能使用它 using namespace System Diagnostics Eventing Reader 我如何让函数看到它 更深入的潜水 代码有
  • 手机号码确认

    我正在设计一个网站 我想验证手机号码 用户在注册页面输入 通过向其手机发送验证码 任何人都可以给我指点我应该如何继续吗 我自豪地推荐cognalys 注 我为 Cognalys 工作 因为它提供了一个优雅的 API 来验证可以集成在任何平台
  • 验证和数据添加到数据库表

    我之前问过的问题pdo 检索数据并填充记录关于输入掩码现在我需要验证用户输入并将输入的内容添加到数据库表中 这是最后一步 我的错误是 正如您在下面的代码中看到的 我误解了插入 and 更新集 using PDO 此外 就有关INSERT I
  • Word VBA“静默”检索IP地址

    我需要将 IP 地址提取到 VBA 宏中 这段代码可以工作 但命令对话框短暂可见 看起来不太好 我可以使用修改来 默默地 完成它吗 Sub getIP Set objShell CreateObject WScript Shell Set
  • 预加载/加载大图像的最快方法

    预加载可能不是正确的术语 我有一个加载非常大图像的页面 我想等待大图像完全加载 然后再向用户显示在页面上 目前 我有一个加载 gif 我正在使用 javascript 等待图像加载 然后用图像替换加载 gif src img src loa
  • 如何在 iPhone 通知警报消息或 SMS 上的纯文本中添加换行符

    iPhone 通知警报消息或纯文本中的换行符代码是什么 SMS Thanks 确实有 n UIAlertView alertView UIAlertView alloc initWithTitle title message message
  • 如何在 R 的整个 gt 表中为相同的值着色相同的颜色?

    我有一个 R 中的 gt 表 想要将所有值着色为相同的颜色 例如 使用 mtcars 数据集 如何将所有 0 的值着色为红色 将所有 4 的值着色为蓝色 library gt mtcars gt gt 我尝试使用tab style and
  • Twig 的逻辑运算符是否计算两个表达式?

    如果我使用 Twig 表达式 例如 if a and function a with a是假的 Twig 还评价吗function a 或者表达式的计算结果为false不评估第二部分 同样与or tl dr 如果第一部分为假 Twig 的逻
  • 如何使用正则表达式检查每个由四个零组成的子字符串后是否至少有四个一?

    我怎样才能写出正则表达式 每当有 0000 时 后面就应该有 1111 例如 00101011000011111111001111010 gt correct 0000110 gt incorect 11110 gt correct 谢谢你
  • 调用中的额外参数“选择器” - NSTimer SchedulerWithTimeInterval

    我有以下代码行 changeColour NSTimer scheduledTimerWithTimeInterval TIMES target self selector changeColourOfPage repeats true 但
  • mybatis使用foreach进行批量插入

    我正在使用 mybatis 我想将 ArrayList 插入到某个表中 好吧 在映射器中使用 foreach 这最终会导致 Oracle 异常 ORA 00933 这是 mybatis 映射器