首页 > 作文

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

更新时间:2023-04-04 11:03:20 阅读: 评论:0

目录
基本环境需求方案改进带自增 id 的批量插入插入完成之后返回 ssionid注意事项总结reference

基本环境

语言:java 8 数据库:oracle orm 框架:mybatis 3.4.5

需求

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

方案

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

int ssionid = dao.queryssionid();for (record record : recordlist) {    dao.inrtrecord(record, ssionid);}return ssionid;

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

改进

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

带自增 id 的批量插入

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

inrt 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 中一般用 quence 来实现,于是比较容易想到的是用下面这种方式:

inrt中学生获奖作文 all   into table (col1, col2, col3) values (quence.nextval, 'val1_2', 'val1_3')   into table (col1, col2, col3) values (quence.nextval, 'val2_2', 'val2_3')   ...lect 1 from dual;

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

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

inrt into target_table (col1, col2, col3)lect col1,       col2,       col3from source_tablewhere condition;

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

inrt into target_table (col1, col2, col3)lect quence.nextval,       col2,       col3from (    lect 'val1_2' col2, 'val1_3' col3 from dual union all    lect 'val2_2' col2, 'val2_3' col3 from dual union all    ...);

mybatisdynamic sql 来实现大致如下:

<inrt id="sampleinrt" parametertype="java.util.list">    inrt into target_table (col1, col2, col3)    lect quence.nextval,, col2, col3 from    在校生证明<foreach collection="list" item="item" index="index" open="(" clo=")" parator=" union all ">        lect #{item.val2} col2, #{ite油炸带鱼的做法m.val2} col3 from dual    </foreach></inrt>

插入完成之后返回 ssionid

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

public class foo {    private int id;    private string col2;    private string col3;}public interface foodao {    void sampleinrt(foo foo);}
<inrt id="sampleinrt" ugeneratedkeys="true" parametertype="foo" keyproperty="id">    <lectkey keyproperty="id" order="before" resulttype="int">        lect ssion_quence.nextval from dual    </lectkey>    inrt into target_table (col1, col2, col3)    values (#{id}, #{col2}, #{col3})</inrt>

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

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

获取 ssionid(ssion_quence.nextval)批量插入带 ssionid 的记录

或者

用 lectkey 选出 ssionid(ssion_quence.nextval)并批量插入记录获取 ssionid(ssion_quence.currval)

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

注意事项

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

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

总结

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

到此这篇关于mybatis批量插入oracle数据的文章就介绍到这了,更多相关mybatis批量插入oracle内容请搜索www.887551.com求职意向怎么写以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

reference

the ultimate guide to oracle inrt all statementoracle inrt into lectinrting multiple rows using a single statementinrting multiple rows with quence in oracle

本文发布于:2023-04-04 11:03:18,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/d8c66a17a7530e773cf75ad70fe2ee01.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Mybatis批量插入Oracle数据的方法实例.doc

本文 PDF 下载地址:Mybatis批量插入Oracle数据的方法实例.pdf

标签:批量   数据   的是   来实现
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图