Java使用iBatis批量插入数据到Oracle数据库

因为我们的数据跨库(mysql,oracle),单独取数据的话需要遍历好多遍,所以就想着先从mysql数据库中取出来的数据然后在oracle数据库中建立结果集对应的临时表,先插入然后再统一查询(中间就节省了遍历再重组数据的时间了)。

1.首先我们从mysql数据库中查询出对应数据

sql:

     <select id="queryUsers" parameterClass="java.util.Map" resultClass="com.demo.report.dao.pojo.User">
<![CDATA[
select name,age,sex from T_user
]]>
</select>

 

2.在oracle数据库中建立对应的临时表,(需要提前在对应的数据库中执行)

drop table report_user ;
create table report_user
(
name VARCHAR2(20),
age VARCHAR2(10),
sex VARCHAR2(6)
);

3.插入的Dao定义,需要注意批量插入数据会有量的限制 ,这里定义每次插入1000条数据

参数类型为List,参数名为: userList

对应sqlmap的方法id为: insertReportUsert2Oracle

    /*Test 20191219 batch insert data*/
public Object insertReportUsert2Oracle(List<User> userList){
Map<String,Object> parm=new HashMap<String, Object>();
int len = userList.size()/1000 +1;
int modlen = userList.size()%1000 ;
System.err.println("len="+len);
System.err.println("modlen="+modlen);
int start = 0;
int end = 1000;
for(int i=0;i<len;i++){
System.err.println(i+"----start="+start);
System.err.println(i+"----end="+end);
List<ArtificialHK> tmpUserList = userList.subList(start, end);
parm.put("userList", tmpUserList);
st.insert("report.insertReportUsert2Oracle", parm);
if(i==(len-2)){
end +=modlen;
}else{
end +=1000;
}
start +=1000; } return "insert";
}

 

4.批量插入oarcle数据库的脚本信息

这里用的关键字是 union all,且记住从List里面获取数据的格式为 userList[].xxx

<sqlMap namespace="report">
<insert id ="insertReportUsert2Oracle" parameterClass="java.util.Map" >
INSERT INTO report_user
(
name
,age
,sex
)
(
<iterate property="userList" conjunction="union all">
select
#userList[].name#,
#userList[].age#,
#userList[].sex# from dual
</iterate>
)
</insert >

  

5.单元测试

     @Test
public void insertReportUsert2OracleTest() throws IMException{
long starttime = System.currentTimeMillis();
System.err.println("===========starttime = " +starttime);
userDao.insertReportUsert2Oracle();
long endtime = System.currentTimeMillis();
System.err.println("===========endtime = " +endtime);
System.err.println("=========== daycount = " + ((endtime-starttime)/1000)+" s"); }

  

 

Java使用iBatis批量插入数据到Oracle数据库的更多相关文章

  1. Java 批量插入数据(Oracle)

    //批量添加20000条数据用时8秒. try {    String url = "jdbc:oracle:thin:@IP:1521:orcl"; // orcl为数据库的SI ...

  2. mybatis批量插入数据到oracle

    mybatis 批量插入数据到oracle报 ”java.sql.SQLException: ORA-00933: SQL 命令未正确结束“  错误解决方法 oracle批量插入使用 insert a ...

  3. mybatis foreach批量插入数据:Oracle与MySQL区别

    mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分 ...

  4. IBatis批量插入数据

    IBatis插入注意,数据量比较多的花,需要分批插入,策略是dao里面控制插入批次,mapper里面批量插入即可 @Override public Long insertBatch(List<W ...

  5. 批量Excel数据导入Oracle数据库

    由于一直基于Oracle数据库上做开发,因此常常会需要把大量的Excel数据导入到Oracle数据库中,其实如果从事SqlServer数据库的开发,那么思路也是一样的,本文主要介绍如何导入Excel数 ...

  6. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

  7. Android 批量插入数据到SQLite数据库

    Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知.因此在Android中插入数据时,使用批量插入的方式 ...

  8. Android批量插入数据到SQLite数据库

    Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知.因此在Android中插入数据时,使用批量插入的方式 ...

  9. 用SqlBulkCopy批量插入数据到SqlServer数据库表中

    首先创建一个数据库连接类:SQLHelper using System; using System.Collections.Generic; using System.Linq; using Syst ...

随机推荐

  1. 扛把子 选题 Scrum立会报告+燃尽图 03

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8680 一.小组情况组长:迟俊文组员:宋晓丽 梁梦瑶 韩昊 刘信鹏队名:扛 ...

  2. 【翻译】全球用尽IPv4的一点思考

    作者:Dimple 公众号:奔跑吧攻城狮 简介:专属于Java和Android开发,和你聊聊职场话题,一同展望未来 作为小小号主的我表示很无力啊,这几天,天天都是热点.前有网易员工勇敢发声维护自己的利 ...

  3. call() 、 apply() 、bind()方法的作用和区别!

    从一开始,我是在书上看到关于bind().call() 和 apply(), 不过长久以来,在工作中与网上接触到了很多关于这三个方法的使用场景,对这三个方法也算是比较熟悉了.所以把他们的作用和区别简单 ...

  4. C#Windows Forms 计算器--xdd

    一.计算器 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...

  5. Centos 7.x 系统基础优化

    Centos 7.x 系统基础优化 1.更换国内yum源 删除系统带的centos官方yum源 rm -rf /etc/yum.repos.d/* 使用国内阿里云源 curl -o /etc/yum. ...

  6. HTML 5 中的textarea标签

    HTML 5 中的textarea标签 定义和用法 定义一个文本区域 (text-area) (一个多行的文本输入区域).用户可在此文本区域中写文本.在一个文本区中,您可输入无限数量的文本.文本区中的 ...

  7. Nginx安装、默认虚拟主机、Nginx用户认证和域名重定向

    6月7日任务 12.6 Nginx安装12.7 默认虚拟主机12.8 Nginx用户认证12.9 Nginx域名重定向 扩展nginx.conf 配置详解 http://www.ha97.com/51 ...

  8. pngquant——一个好用的png压缩工具

    一个可以进行有损图片压缩的命令行工具和代码库. 网址:https://pngquant.org/ 1.为什么选择pngquant 传说中的神器——tinyPng 我们现在用的工具——ImageAlph ...

  9. matlab实现PSNR

    目录 1.PSNR原理 2.PSNR的matlab实现代码 3.针对彩色图像的PSNR的matlab代码 @ 1.PSNR原理 PSNR,峰值信噪比,通常用来评价一幅图像压缩后和原图像相比质量的好坏, ...

  10. Erlang/Elixir精选-第2期(20191209)

    Spot The Discrepancies with Dialyzer for Erlang. 如何在大型Erlang项目中从零开始一步步践行Dialyzer. Which companies ar ...