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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM