MyBatis Oracleデータベース・データの一括処理


今日はプロジェクト開発で大量挿入データが必要で、ネット上でコードを見つけやすいのですが、間違ったSQLが正しく終了していません.後で調べましたが、MySQLの大量挿入を使ったからです.
ここにOracleのバッチ挿入コードを貼り付けて記録します.

	INSERT INTO TABLE_NAME 
	(ID,NAME,VALUE)
	SELECT SEQUENCE.NEXTVAL ID,A.* FROM (
		
			SELECT 
			#{item.name,jdbcType=VARCHAR},
			#{item.value,jdbcType=DOUBLE}
			FROM DUAL
		
	) A

注意:insert文にvaluesキーは書かれていません.そうしないと、エラーが発生します.
シーケンス自己増加プライマリ・キーを使用しない場合は、次のようになります.

    INSERT INTO TABLE_NAME 
    (ID,NAME,VALUE)
    
    	SELECT
    	#{item.id,jdbcType=VARCHAR},
    	#{item.name,jdbcType=VARCHAR},
    	#{item.value,jdbcType=DOUBLE}
    	FROM DUAL
    

一括更新:

	
		update table_name set
		value = #{item.value,jdbcType=DOUBLE}
		where id = #{item.id,jdbcType=VARCHAR}
	

一括削除:

	
		delete from table_name
		where id = #{item.id} and name = #{item.name}
	

注意:
jdbcTypeは通常は書かなくてもいいですが、nullがある場合はjdbcTypeを宣言する必要があります.そうしないとエラーが発生します.
ポイント:ロットinsertの効率問題!
その後、プロジェクトでは、データが少し大きいため、例えば1万件以上ある場合、ロットinsertの効率が異常に悪くなり、20分以上かかり、さらに長くかかります.むしろjavaでforループで1つのデータが挿入されるたびに.後で調べてみると、挿入するリストをjavaでsubListメソッドで分割し、複数回処理することができます.コードは以下の通りです:(このコードはネット上でも見つかりますが、彼らの論理に問題があることに気づき、一部のデータが漏れ、修正しました)
サービス実装クラスの主なコード:
ArrayList list = new ArrayList<>();//    list      
int count = 0;		//      
if (list != null && list.size() > 0) {
	int batchCount = 500;				//            
	int batchLastIndex = batchCount;	//      list       
	for (int index = 0; index < endowList.size(); ) {	//  index        
		if (batchLastIndex >= endowList.size()) {
			//       list size ,        list size,subList       
			batchLastIndex = endowList.size();
			count += testDao.insertAll(list.subList(index, batchLastIndex),table_name);
			break;		//       ,    
		} else {
			count += testDao.insertAll(list.subList(index, batchLastIndex),table_name);
			//     insert  ,            
			index = batchLastIndex;	
			//               +           
			batchLastIndex = index + batchCount;
		}
	}
}
return count;

以上のように、大きなデータをバッチ処理することで、ある程度効率を向上させることができる.ロットごとに挿入するデータ量を試したことがありますが、サイズが500の場合、相対効率は800や1000よりずっと高く、他のデータ量のサイズは試したことがありません.