广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Mybatis批量插入Oracle数据的方法实例
  • 230
分享到

Mybatis批量插入Oracle数据的方法实例

2024-04-02 19:04:59 230人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录基本环境需求方案改进带自增 id 的批量插入插入完成之后返回 sessionId注意事项总结Reference基本环境 语言:Java 8 数据库:oracle ORM 框架:m

基本环境

语言:Java 8 数据库oracle ORM 框架mybatis 3.4.5

需求

批量插入数据,数据需要有自增 id。每次插入有一个唯一的 sessionId 来标记这些记录,插入完成之后返回这个 sessionId。

方案

循环插入单条记录,伪代码:

int sessionId = dao.querySessionId();
for (Record record : recordList) {
    dao.insertRecord(record, sessionId);
}
return sessionId;

上述解决方案很简明易懂,但是循环中每次 insert 操作都会与 DB 交互一次,当数据量很大时,会花费很多时间在网络传输上,导致性能问题。

改进

问题可以通过批量插入来改善。

带自增 id 的批量插入

Oracle 中比较常见的批量插入模版是:

INSERT ALL
   INTO target_table (col1, col2, col3) VALUES ('id1_1', 'val1_2', 'val1_3')
   INTO target_table (col1, col2, col3) VALUES ('id2_1', 'val2_2', 'val2_3')
   ...
Subquery;

但是每条记录都需要有一个自增 id,Oracle 中一般用 Sequence 来实现,于是比较容易想到的是用下面这种方式:

INSERT ALL
   INTO table (col1, col2, col3) VALUES (SEQUENCE.NEXTVAL, 'val1_2', 'val1_3')
   INTO table (col1, col2, col3) VALUES (SEQUENCE.NEXTVAL, 'val2_2', 'val2_3')
   ...
SELECT 1 FROM DUAL;

不过遗憾的是,上述方案行不通,因为所有的 SEQUENCE.NEXTVAL 都会是同一个值,会产生主键冲突。

接着尝试其他的方案。Oracle 支持从一个表里批量选取数据插入另一个表中:

INSERT INTO target_table (col1, col2, col3)
SELECT col1,
       col2,
       col3
FROM source_table
WHERE condition;

用上述方式,我们可以把被插入的数据用 UNION ALL 构造一个子表,也就是上面的 source_table 来实现批量插入。跟 INSERT ALL INTO 相比的好处是,可以使用 Sequence 的自增值:

INSERT INTO target_table (col1, col2, col3)
SELECT SEQUENCE.NEXTVAL,
       col2,
       col3
FROM (
    SELECT 'val1_2' col2, 'val1_3' col3 FROM dual UNION ALL
    SELECT 'val2_2' col2, 'val2_3' col3 FROM dual UNION ALL
    ...
);

MyBatisdynamic sql 来实现大致如下:

<insert id="sampleInsert" parameterType="java.util.List">
    INSERT INTO target_table (col1, col2, col3)
    SELECT SEQUENCE.NEXTVAL,, col2, col3 FROM
    <foreach collection="list" item="item" index="index" open="(" close=")" separator=" UNION ALL ">
        SELECT #{item.val2} col2, #{item.val2} col3 FROM dual
    </foreach>
</insert>

插入完成之后返回 sessionId

Mybatis 中,返回某个 property 可以用 SelectKey。SelecTKEy 是 Insert 的子标签,实现原理是在执行插入语句之前先做一次 SelectKey 的子查询,此处,可以将子查询的结果赋值到查询的参数当中,例如

public class Foo {
    private int id;
    private String col2;
    private String col3;
}
public interface FooDao {
    void sampleInsert(Foo foo);
}
<insert id="sampleInsert" useGeneratedKeys="true" parameterType="Foo" keyProperty="id">
    <selectKey keyProperty="id" order="BEFORE" resultType="int">
        SELECT SESSION_SEQUENCE.NEXTVAL FROM DUAL
    </selectKey>
    INSERT INTO target_table (col1, col2, col3)
    VALUES (#{id}, #{col2}, #{col3})
</insert>

当插入结束之后,参数 foo.id 就会是 SESSION_SEQUENCE 的自增值(注意在 Dao 中不能用 @Param() 标注参数)。

然而这种方式只支持单条记录的插入,Oracle 中批量插入的情况就无法完成赋值了。所以此处只能分成两步来做:

  • 获取 sessionId(SESSION_SEQUENCE.NEXTVAL)
  • 批量插入带 sessionId 的记录

或者

  • 用 SelectKey 选出 sessionId(SESSION_SEQUENCE.NEXTVAL)并批量插入记录
  • 获取 sessionId(SESSION_SEQUENCE.CURRVAL)

注意上述第二种方式,需要保证两个方法在同一个 Transaction 里面,否则 Sequence 的值会不一致。

注意事项

oracle中用insert into xxx values (xxx,xxx),(xxx,xxx) 这种语法应该通不过的,会报错,ORA-00933: sql 命令未正确结束,要用这种

insert into  t_test (id, prop_name)   
select 1,'aaa' from dual union all    
select 2,'bbb' from dual union all  
select 3,'ccc' from dual;

总结

本文简单总结了在 MyBatis 中往 Oracle 批量插入数据的方法,作一个快速笔记

到此这篇关于Mybatis批量插入Oracle数据的文章就介绍到这了,更多相关Mybatis批量插入Oracle内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

Reference

  • The Ultimate Guide to Oracle INSERT ALL Statement
  • Oracle INSERT INTO SELECT
  • Inserting Multiple Rows Using a Single Statement
  • Inserting multiple rows with sequence in Oracle

--结束END--

本文标题: Mybatis批量插入Oracle数据的方法实例

本文链接: https://www.lsjlt.com/news/161885.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mybatis批量插入Oracle数据的方法实例
    目录基本环境需求方案改进带自增 id 的批量插入插入完成之后返回 sessionId注意事项总结Reference基本环境 语言:Java 8 数据库:Oracle ORM 框架:M...
    99+
    2022-11-12
  • MyBatis批量插入数据的三种方法实例
    目录前言准备工作1.循环单次插入2.MP批量插入①控制器实现②业务逻辑层实现③数据持久层实现MP性能测试MP源码分析3.原生批量插入①业务逻辑层扩展②数据持久层扩展③添加UserMa...
    99+
    2022-11-12
  • MyBatis实现批量插入方法实例
    目录一、SQL实现示例二、Mybatis通过Mapper.xml文件实现三、在Mapper接口上使用注解四、限制一次批量插入数据的数量总结一、SQL实现示例 假设我们只插入一条数据的...
    99+
    2022-11-13
    mybatis批量插入 mybatis插入书籍
  • MyBatis 批量插入数据的 3 种方法!
    数据库的最终效果如下: 1.循环单次插入 接下来我们将使用 Spring Boot 项目,批量插入 10W 条数据来分别测试各个方法的执行时间。​ 循环单次插入的(测试)核心代码如下: import com.example.de...
    99+
    2023-09-11
    mybatis java 数据库
  • MyBatis-Plus 批量插入数据的操作方法
    spring boot+mybatis plus环境,单条插入用的是BaseMapper自带的insert方法 public ApiResult addAnc(Anc anc) ...
    99+
    2022-11-12
  • Mybatis批量插入大量数据的方法有哪些
    本文小编为大家详细介绍“Mybatis批量插入大量数据的方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis批量插入大量数据的方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Mybat...
    99+
    2023-07-05
  • Mybatis三种批量插入数据的方式
    目录1. 循环插入 2. foreach标签 3. 批处理 三种方式的对比 1. 循环插入 mapper.xml: <?xml version="1.0" enc...
    99+
    2022-11-12
  • Mybatis批量插入数据的两种方式
    总体描述 软件开发过程中需要批量插入数据的场景有几种: 从离线文件(excel, csv等)导入大批量数据到系统。从其它系统定时或者人工同步大批量数据到系统。程序自身的某些算法执行时会生成大批量数据保...
    99+
    2023-09-07
    mybatis java 开发语言 batch insert
  • Mybatis批量插入大量数据最优方式
    Mybatis批量插入的方式有三种 1. 普通插入 2. foreach 优化插入 3. ExecutorType.BATCH插入 下面对这三种分别进行比较: 1.普通插入 默认的插入方式是遍历ins...
    99+
    2023-09-06
    mybatis java mysql
  • MyBatis如何实现批量插入数据
    本文小编为大家详细介绍“MyBatis如何实现批量插入数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“MyBatis如何实现批量插入数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、SQL实现示例假设我们...
    99+
    2023-07-04
  • MyBatis如何批量插入大量数据
    这篇文章将为大家详细讲解有关MyBatis如何批量插入大量数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题背景:只用MyBatis中foreach进行批量插入数据,一次性插入超过一千条的时候MyBa...
    99+
    2023-06-22
  • ORACLE大批量插入数据的方法是什么
    这篇文章主要介绍了ORACLE大批量插入数据的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ORACLE大批量插入数据的方法是什么文章都会有所收获,下面我们一起来看看吧。最近有几张表随着时间不断的增长...
    99+
    2023-07-05
  • mybatis批量插入10万条数据的示例分析
    这篇文章给大家分享的是有关mybatis批量插入10万条数据的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。数据库 在使用mybatis插入大量数据的时候,为了提高效率,放弃循环插入,改为批量插入,map...
    99+
    2023-06-14
  • 大批量数据分批批量插入或更新(Mybatis+MySQL)
    大批量数据分批批量插入或更新 在MySQL数据库的前提下,插入或更新大批量数据。首先批量插入需要考虑到以下几个因素: 数据库一次可以承受多大或者多少条数据的插入批量插入是否会占用Mysql资源太久,影响系统整体使用性能代码中的集合是否会造成...
    99+
    2023-08-30
    mybatis mysql 数据库 java spring boot
  • MyBatis批量插入大量数据(1w以上)
    问题背景:只用MyBatis中foreach进行批量插入数据,一次性插入超过一千条的时候MyBatis开始报错。项目使用技术:SpringBoot、MyBatis 批量插入碰到的问题...
    99+
    2022-11-12
  • Mybatis批量插入大量数据的最优方式总结
    目录Mybatis批量插入的方式有三种下面对这三种分别进行比较:1.普通插入2.foreach 优化插入3.ExecutorType.BATCH插入总结:Mybatis批量插入的方式...
    99+
    2023-03-19
    mybatis大量数据批量insert mybatis 批量插数据 mybatis批量新增数据
  • Mysql大数据批量插入方法
    MySQL是当前最流行的关系型数据库之一,大数据批量插入是MySQL中常用的操作之一。在处理大量数据时,如果一条一条地插入会极大地影响效率,因此批量插入是一个更好的选择,可以大大提高数据的处理速度。下面介绍几种MySQL大数据批量插入的方法...
    99+
    2023-09-14
    mysql 大数据 数据库
  • MyBatis实现MySQL的批量插入
    准备工作 首先,我们需要确保以下几点: 你已经安装了MySQL数据库,并且可以正常连接。你已经配置好了MyBatis的环境,并且可以成功执行单条插入语句。 数据库表准备 为了演示批量插入的过程,我们创...
    99+
    2023-09-06
    mybatis mysql java
  • mysql大批量插入数据的4种方法示例
    前言 本文主要给大家介绍了关于mysql大批量插入数据的4种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法一:循环插入 这个也是最普通的方式,如果数据量不是很大,可以使用,但是...
    99+
    2022-10-18
  • Mybatis Plus 实现批量插入的示例代码
    目录一. 添加依赖二. 继承默认方法注入三. 在 MybatisPlusConfig 配置文件中注入 Bean四. 扩展自带 BaseMapper五. 业务层面实现Mybatis P...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作