Oracle MyBatis批量插入性能对比测评

2026-06-16阅读 0热度 0
其他
目录
在真实业务场景中,批量插入是高频操作。面对海量数据写入需求,插入方案的选择直接左右系统吞吐量与开发效率。本文聚焦Oracle环境下,借助Mybatis进行批量插入的几种主流实现策略,拆解其底层机制与关键约束。

循环调用单次插入

最直观的方案是写循环逐条执行INSERT。逻辑简单,但性能瓶颈明显:每条INSERT都伴随一次网络往返与独立事务开销,数据量一旦膨胀,耗时呈线性增长。仅在数据规模极小或对延迟无敏感要求的场景下可接受,此处不做细节演示。

【Oracle】Mybatis 批量插入数据

方式一:begin … end

借助Oracle的PL/SQL匿名块,将多条INSERT语句包裹在同一begin…end块中。在Mapper.xml中通过``动态拼接所有插入语句,实现单次网络往返批量提交。

Mapper.xml

代码语言:ja vascript 复制 begin insert into t_ds_process_task_relation_log (...) values (...); end;

sql

代码语言:ja vascript 复制 begin insert into t_ds_process_task_relation(...) values(...); insert into t_ds_process_task_relation(...) values(...); insert into t_ds_process_task_relation(...) values(...); end; 一个极易踩坑的点:**begin … end 块无返回值(或固定返回 -1)**。这意味着无法通过传统方式获取“受影响行数”。若业务逻辑依赖插入结果校验或行数统计,此方法并不适用。

方式二:insert all into …

另一种常用套路是利用Oracle的`INSERT ALL`多表插入语法,单条语句内完成对同一表或多表的多行写入。

Mapper.xml

代码语言:ja vascript 复制 insert all into t_ds_process_task_relation_log (...) values (...) select ${taskRelationList.size} from dual

sql

代码语言:ja vascript 复制 insert all into t_ds_process_task_relation(...) values(...) into t_ds_process_task_relation(...) values(...) select 2 from dual 尾部的`select … from dual`是整个INSERT ALL语句的“驱动行数”来源,**最终返回值由该SELECT语句的行数决定**。如需精确获取总影响行数,可通过调整`select`的返回行数间接控制。

其他方式(未使用Mybatis验证)

除上述Mybatis框架内的实现外,Oracle原生还支持通过`INSERT INTO … SELECT … UNION ALL`组合完成批量插入。 代码语言:ja vascript 复制 -- 创建测试表 create table t_demo(tno NUMBER(3), tname VARCHAR2(30), flag VARCHAR2(20)); -- 插入数据 insert into t_demo(tno, tname, flag) select * from ( select 11 tno, '张三1' tname, '1' flag from dual union select 12 tno, '张三2' tname, '1' flag from dual union select 13 tno, '张三3' tname, '1' flag from dual ); -- 验证 select * from t_demo; 此方案未在Mybatis环境下完整验证,但语法本身可行。它利用`UNION ALL`合并多个`SELECT FROM DUAL`的结果集作为数据源,一次性写入。逻辑清晰,但手工拼接工作量大,且需额外的动态SQL处理。
免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

相关阅读

更多
欢迎回来 登录或注册后,可保存提示词和历史记录
登录后可同步收藏、历史记录和常用模板
注册即表示同意服务条款与隐私政策