zoukankan      html  css  js  c++  java
  • Java使用iBatis批量插入数据到Oracle数据库

    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");
    		
    	}
    

      

     

  • 相关阅读:
    .Net 控制台动态刷新使用
    VS 将!=转换成 ≠
    C# 自定义Html分页
    .NET MVC ModelBinder基本使用
    C# 重启电脑 程序自启动
    ASP.NET JsonResult返回日期格式及首字母大写解决
    java快速排序代码实现
    系统高可靠的设计需要考虑哪些方面
    sentinel源码学习--transport模块
    TiDB学习笔记分享--存储篇
  • 原文地址:https://www.cnblogs.com/DFX339/p/12072179.html
Copyright © 2011-2022 走看看