Java iBatisを使用してOracleデータベースに大量にデータを挿入

2637 ワード

Java iBatisを使用してOracleデータベースに大量にデータを挿入
 
私たちのデータはライブラリ(mysql,oracle)にまたがっているので、単独でデータを取るには何度も遍歴する必要があるので、mysqlデータベースから取り出したデータをoracleデータベースで結果セットに対応するテンポラリ・テーブルを作成し、挿入してからクエリーを統一したいと思っています(その間に遍歴してデータを再編成する時間が節約されます).
 
1.まずmysqlデータベースから対応データを検索する
sql:
     

 
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は、insertReportUsert 2 O racle
    /*Test 20191219 batch insert data*/
	public Object insertReportUsert2Oracle(List userList){
		Map parm=new HashMap();
		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 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であり、リストから取得するデータのフォーマットはuserList[]であることを記憶する.xxx
	

	INSERT INTO report_user
	(
		name 
		,age 
		,sex
	)
	(
	
	select		
			#userList[].name#,
			#userList[].age#,
			#userList[].sex#
			
	from dual
	
	)
 

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