Mybatis批量插入和批量更新数据的资料相信大家从网上能查找到很多资料,本文重点总结一下mybatis执行批量插入insert和批量更新update数据。在mysql数据库中批量插入,如:insert into ... values (),(),...语法;而在oracle数据库中批量插入如:insert into selcect ... union all select ...语法。

mysql批量插入

INSERT INTO T_P_ROLE_MODULE (ROLE_ID, MODULE_ID)

VALUES

separator=",">

( #{item.roleId}, #{item.moduleId})

oracle批量插入

INSERT INTO T_P_ROLE_MODULE (ROLE_ID, MODULE_ID)

SELECT #{item.roleId}, #{item.moduleId} FROM DUAL

如果传入多个参数时需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以collection属性值就是传入的List或array对象封装的map里面的key值。

测试这种方式可行性并插入指定序列,参考配置如下:

SELECT SEQ_XXX.NEXTVAL , #{item.roleId}, #{item.moduleId} FROM DUAL

报ORA-02287: sequence number not allowed here错误异常。ORA-02287错误网上最多的例子就是序列不能跟group by一起使用,解决方法就是把group by语句包起来,外层再select序列就可以了。目前这个错误显示不是group by的问题,也有神似大仙的人物建议使用oracle的insert all,可这个是将数据插入多张表的语句,与当前问题不属于同一范畴。在一个wiki里看到ORA-02287错误的详细描述:http://www.orafaq.com/wiki/ORA-02287The following are the cases where you can't use a sequence:

For a SELECT Statement:

In a WHERE clause

In a GROUP BY or ORDER BY clause

In a DISTINCT clause

Along with a UNION or INTERSECT or MINUS

In a sub-query

Other areas:

A sub-query of Update or Delete

In a View or snapshot

In a DEFAULT or CHECK Condition of a table definition

Within a single SQL statement that uses CURRVAL or NEXTVAL, all referenced LONG columns, updated tables,

and locked tables must be located on the same database.

其中讲到union中也不用使用序列。UNION 指令的目的是将两个 SQL 语句的结果合并起来,可以查看你要的查询结果. UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。 UNION ALL的用法和union一样,只不过union含有distinct的功能,它会把两张表了重复的记录去掉,而union all不会,所以从效率上,union all 会高一点。

这里就是union中不能使用序列的问题,将select序列语句再往里包一层也是不行的,union会嵌套向里层检查。往里包不行,就往外包,写成这样可行select SEQ_XXX.NEXTVAL, a.* from

(select 1,'66' from dual union

select 2,'77' from dual) a

于是foreach的配置可以修改成如下:

open="select SEQ_XXX.NEXTVAL, a.* from (" close=") a">

select #{item.code,jdbcType=VARCHAR}, #{item.name,jdbcType=VARCHAR} from dual

参考资料:http://ljhzzyx.blog.163.com/blog/static/38380312201353536375,在mybatis配置中oracle和mysql数据库批量更新update也是有很大的不同之处:

mysql批量更新

mysql数据库采用一下写法即可执行,但是数据库连接必须配置:&allowMultiQueries=true,如:jdbc:mysql://blog.yoodb.com:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true

update test  test=${item.test}+1  where id = ${item.id}

oracle批量更新

update test  test=${item.test}+1  where id = ${item.id}

Mybatis中sql配置文件属性参数含义说明,参考图:

对于foreach标签的解释参考了网上的资料,具体如下:

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合,foreach元素的属性主要有 item,index,collection,open,separator,close。

item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map

batchupdate写法_mybatis执行批量插入insert和批量更新update相关推荐

  1. mybatis批量插入(insert)和批量更新(update)

    文章目录 一.Mybatis批量插入 二.批量更新 前言:这两天在做mybatis批量插入和更新的时候,对这块不是很清楚,所以今天写篇文章,巩固加深印象. 一.Mybatis批量插入 批量插入的sql ...

  2. pg批量插入_PostgreSQL实现批量插入、更新与合并操作的方法

    前言 就在 2019 年 1 月份微软收购了 PostgreSQL 数据库的初创公司 CitusData, 在云数据库方面可以增强与 AWS 的竟争.AWS 的 RDS 两大开源数据库就是 MySQL ...

  3. SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入)

    原文:SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入) 临时表:Test /****** 对象: Table [dbo].[Test] 脚本日期: 05/10/2013 11:4 ...

  4. oracle批量插入优化,oracle批量插入优化方案

    今天听DBA说如果从一个表批量查询出一批数据之后批量插入另外一张表的优化方案: 1)不写归档日志: 2)采用独占 关于insert /*+ append */我们需要注意以下三点: a.非归档模式下, ...

  5. 数据库批量插入Insert ALL into报错ORA-00933:SQL命令未正确结束

    起因 : 批量插入数据库表报错 代码演示 : @Insert("<script> Insert ALL into table(字段1,字段2) values<foreach ...

  6. mysql delete返回值_Mybatis执行sql(insert、update、delete)返回值问题

    数据库:Mysql 在使用mybatis的过程中对执行sql的返回值产生疑问,顺手记录一下. 结论: insert:   插入n条记录,返回影响行数n.(n>=1,n为0时实际为插入失败) up ...

  7. sql加上唯一索引后批量插入_MySQL当批量插入遇上唯一索引

    一.背景 以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表 ...

  8. mysql jdbc驱动 批量更新_jdbc批量插入,删除,更新

    批量处理:一次向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能. 不确定JDBC驱动程序是否支持此功能.应该使用DatabaseMetaData.supportsBatchUpdates( ...

  9. sql批量插入数据mysql_MYSQL批量插入数据库实现语句性能分析

    假定我们的表结构如下: CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( 50 ) NOT NULL, value VARCH ...

最新文章

  1. Hadoop 分布式文件系统 - HDFS
  2. 异步asynctask
  3. 事故现场之依赖了不该依赖的 host ip
  4. SAP Fiori应用里对国际化RTL需求(right-to-left)的支持
  5. 如何取消 登录_LSAT | 退考、缺考、取消成绩,各自的区别和流程是怎样的?
  6. 面试官系统精讲Java源码及大厂真题 - 44 场景实战:ThreadLocal 在上下文传值场景下的实践
  7. drf版本控制 和django缓存,跨域问题,
  8. 【前端 · 面试 】TCP 总结(一)—— 概述
  9. 利用hdparm工具配合crontab使硬盘不用时休眠
  10. MagicDraw建模显示中文问题
  11. 富爸爸穷爸爸--读书笔记
  12. Apache Doris ODBC mysql外表注意事项
  13. java计算机毕业设计婴幼儿玩具共享租售平台源码+数据库+系统+lw文档+mybatis+运行部署
  14. Python for Data Analysis v2 | Notes_ Chapter_5 pandas 入门
  15. JavaMail实现发送邮件程序
  16. NVIDIA GeForce RTX 3080 with CUDA capability sm_86 is not compatible with the current PyTorch
  17. 谷歌2014年中国区应届毕业生校园招聘B轮机试第一题——数独问题的解法(C++实现)
  18. 什么是好代码-代码整洁之道阅读笔记
  19. 山农某Freshman的试水——结构
  20. 利用sfntly的sfnttool.jar提取中文字体

热门文章

  1. QA——性能优化(一)
  2. Linux 绑定IP
  3. 项目管理中的团队建设
  4. 【知识图谱】构建射雕三部曲人物关系
  5. Unity3d多人在线教程
  6. HCL实验:用VRRP实现路由备份及负载分担
  7. python 桑基图_3行代码基于python的matplotlib绘制桑基图
  8. python 白噪声检验-Python中的白噪声时间训练
  9. 常见的SQL注入类型
  10. 人脸扫描建模_一种基于三维扫描数据的人脸建模方法