Java実装の一括インポートExcelデータデータベース
概要:
このガジェットクラスは、クロスデータベース誘導体の数に言及する必要があるときにああ、...いくつかの必要性は、OracleのMySQLは、MySQLからいくつかのOracleのインポートからインポートするためのエピソードで動作します
練習の後、我々はNavicatはMySQLデータベースに接続するためのツールを使用しています、csv形式として、Oracleデータベースからデータをエクスポート、インポートのMySQLは非常に高速で、おそらく問題はそれの毎分
しかし、我々はオープンで、私は通常50000 6のデータフィールド..... PLSQLのOracleデータベース接続を使用して、非常に遅い、Oracleを挿入するSQLファイルmysqlデータベースの形式でデータをエクスポートするときコマンドウィンドウは、ほぼ2時間を実行する必要がある - これは本当に恐ろしいツールであり、時には問題があり、低すぎると効率...再び開始する....中断を余儀なくされました
以下の派生ツールを使用してそう。
新しいMavenプロジェクト、プロジェクト名は、ああカスタマイズすることができます
直接メインメソッドを実行するために使用ExecuteDataExcelToOracle.javaクラス
あなたのExcelファイルを交換する必要があります
あなたは、データベースの接続情報を交換する必要があります
あなたのテーブルの情報を交換する必要がある、とフィールド(内部ここもフィールドデータ関連ああ、あなたはフィールドには〜あなた自身を追加して続けてください以上10ヘクタールでインポートする場合)
主に、私たちは次のことを実行します。
オブジェクトにExcelファイル、Excelデータファイルを一つずつ解決
2.データベースにデータベースのデータに接続します
このツールのクラスのインポートデータにより、約50,000データは限り2分、および時間のほとんどはエクセル〜の構文解析に費やされているとして、効率は〜単にハハハッハッハ普通高くありません
パッケージcom.imodule.dataImport.dataImport.main; インポートのjava.io.File; 輸入java.io.FileInputStream; インポートしたjava.io.Serializable; インポートのjava.sql.Connection; インポートのjava.sql.DriverManager。 インポートのjava.sql.PreparedStatement; 輸入ます。java.sql.SQLException; 輸入java.text.DateFormatの。 輸入java.text.SimpleDateFormatの。 輸入はjava.util.ArrayList; 輸入はjava.util.List; 輸入java.util.Date; 輸入org.apache.commons.lang.StringUtils。 輸入org.apache.poi.ss.usermodel.CellType。 輸入org.apache.poi.ss.usermodel.Row。 輸入org.apache.poi.ss.usermodel.Sheet。 輸入org.apache.poi.ss.usermodel.Workbook; 輸入org.apache.poi.ss.usermodel.WorkbookFactory; パブリッククラスExecuteDataExcelToOracle { パブリック静的無効メイン(文字列[] args){ {試みる リスト<データ> DATAS = loadExcel( "C:/Users/xxxx/Desktop/aa.xlsx"); //需要替换 batchInsert(DATAS)。 }キャッチ(例外e){ e.printStackTrace(); } } / ** *获取エクセル中的数据 * @paramファイルパス * @return * @throws例外 * / パブリック静的リスト<データ> loadExcel(文字列のファイルパスが)例外{スロー ファイルファイル=新しいファイル(ファイルパス)を、 ワークブックWB = WorkbookFactory.create(新しいFileInputStreamを(ファイル)); シートのシート= wb.getSheetAt(0)。 リスト<データ> =新しい新しいDATASのArrayList <>(); //ラインによりデータ線にデータを追加するには、インサートとして、コレクションに追加され基準へのデータ 行row = NULL; 以下のために(INT I = 1; I <= sheet.getLastRowNum(); iは++){ するSystem.out.println( "i =" + I)。 行= sheet.getRow(I)。 IF(行は== NULL || StringUtils.isEmpty(row.getCell(0).getStringCellValue())){ 続けます。 } データData =新しいExecuteDataExcelToOracle()新しいデータ()。 data.setStr1(row.getCell(0)== nullの"":?row.getCell(0).getStringCellValue()); data.setStr2(row.getCell(1)== nullの"":?row.getCell(1).getStringCellValue()); data.setStr3(row.getCell(2)== nullの"":?row.getCell(2).getStringCellValue()); data.setStr4(row.getCell(3)== nullの"":?row.getCell(3).getStringCellValue()); data.setStr5(row.getCell(4)== nullの"":?row.getCell(4)。 data.setStr6(row.getCell(5)== nullの"":?row.getCell(5).getStringCellValue()); // row.getCell(5).setCellType(CellType.STRING)。 IF(row.getCell(6)== NULL){ data.setStr7( "")。 }他{ 日付d =(日)row.getCell(6).getDateCellValue(); DateFormatのフォーマッタ=新しいてSimpleDateFormat( "YYYY-MM-DD HH:MM:SS")。 文字列、日付= formater.format(D)。 data.setStr7(日付); } data.setStr8(row.getCell(7)== NULL "":row.getCell(7).getStringCellValue())。 data.setStr9(row.getCell(8)== nullの"":?row.getCell(8).getStringCellValue()); data.setStr10(row.getCell(9)== nullの"":?row.getCell(9).getStringCellValue()); datas.add(データ)。 件のデータを返します。 } / ** *批量执行插入数据 * @paramのDATAS * / パブリック静的ボイドbatchInsert(一覧<データ> DATAS){ 長いのstartTime =にSystem.currentTimeMillis(); 接続でCONN = NULL; stmt.setString(3、v.getStr3())。 stmt.setString(4、v.getStr4())。 試み{ Class.forNameの( "oracle.jdbc.driver.OracleDriverと"); //あなたはそれを交換する必要がある場合は、Oracleを交換する必要がある場合、MySQL でCONN =したDriverManager.getConnection( " JDBC:オラクル:薄い:10.11.22.33 @ 1521::デモ""根"" 111「);//交換する必要があります conn.setAutoCommit(偽); PreparedStatement STMT = conn.prepareStatement( ")、、、、、、、、、(temp_user_info値にINSERT??????????")。//需要替换 //System.out.println( "数据大小:" + datas.size()); int型NUM = 0; (データV:DATAS)用{ NUM ++。 stmt.setString(1、v.getStr1())。 stmt.setString(2、v.getStr2())。 stmt.setString(5、v.getStr5())。 // stmt.setString(6、v.getStr6())。 stmt.setString(6、v.getStr6())。 stmt.setString(7、v.getStr7())。 stmt.setString(8、v.getStr8())。 stmt.setString(9、v.getStr9())。 stmt.setString(10、v.getStr10())。 stmt.addBatch(); //每5万、提交一次 IF(NUM> 50000){ stmt.executeBatch()。 conn.commit(); NUM = 0; } } stmt.executeBatch()。 conn.commit(); }キャッチ(例外e){ e.printStackTrace(); {試みる conn.rollbackを(); }キャッチ(のSQLException E1){ e1.printStackTrace(); } }最後に{ {試みる ()はconn.closeします。 }キャッチ(のSQLException E){ e.printStackTrace(); } 長いendTimeは=にSystem.currentTimeMillis(); System.out.println( "方法执行时间:" +(endTimeは-のstartTime)+ "MS")。 } } クラスデータは{シリアライズ実装します プライベート静的最終長いのserialVersionUID = 1L。 プライベート文字列STR1。 プライベート文字列STR2。 プライベート文字列STR3。 プライベート文字列STR4。 プライベート文字列STR5。 プライベート文字列STR6。 プライベート文字列STR7。 プライベート文字列STR8。 プライベート文字列STR9。 プライベート文字列STR10。 パブリック文字列getStr7(){ 戻りSTR7。 } 公共ボイドsetStr7(文字列STR7){ this.str7 = STR7。 } パブリック文字列getStr8(){ 戻りSTR8。 } 公共ボイドsetStr8(文字列STR8){ this.str8 = STR8。 } パブリック文字列getStr9(){ 戻りSTR9。 } 公共ボイドsetStr9(文字列STR9){ this.str9 = STR9。 } パブリック文字列getStr10(){ STR10を返します。 } 公共ボイドsetStr10(文字列STR10){ this.str10 = STR10。 } パブリック文字列getStr1(){ 戻りSTR1。 } 公共ボイドsetStr1(文字列STR1){ this.str1 = STR1。 } パブリック文字列getStr2(){ 戻りSTR2。 } 公共ボイドsetStr2(文字列STR2){ this.str2 = STR2。 } パブリック文字列getStr3(){ 戻りSTR3。 } 公共ボイドsetStr3(文字列STR3){ this.str3 = STR3。 } パブリック文字列getStr4(){ 戻りSTR4。 } 公共ボイドsetStr4(文字列STR4){ this.str4 = STR4。 } パブリック文字列getStr5(){ 戻りSTR5。 } 公共ボイドsetStr5(文字列STR5){ this.str5 = STR5。 } パブリック文字列getStr6(){ 戻り化6。 } 公共ボイドsetStr6(文字列化6){ this.str6 =化6。 } } }
pom.xml
<プロジェクトのxmlns = "http://maven.apache.org/POM/4.0.0"のxmlns:XSI = "http://www.w3.org/2001/XMLSchema-instance" のxsi:schemaLocationの= "のhttp:/ /maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> <modelVersion> 4.0.0 </ modelVersion> <groupIdを> com.imodule。 dataImport </ groupIdを> <たartifactId> dataImport </たartifactId> <バージョン> 0.0.1-SNAPSHOT </バージョン> <パッケージ> JAR </パッケージ> <名前> dataImport </名前> <URL>のhttp://達人。 apache.org </ URL> <プロパティ> <project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding> </プロパティ> <依存関係> <依存> <groupIdを> JUnitの</ groupIdを> <たartifactId> JUnitの</たartifactId> <バージョン> 3.8.1 </ version>の <スコープ>テスト</スコープ> </依存関係> <! -ポイ相关- > <依存> <groupIdを> org.apache.poi </ groupIdを> <たartifactId>ポイ</たartifactId> <バージョン> 4.0.1 </バージョン> </依存> <依存性> <のgroupId> org.apache.poi </のgroupId> <たartifactId> POI-OOXML </たartifactId> <バージョン> 4.0.1 < /バージョン> </依存> <依存性> <のgroupId> org.apache.poi </のgroupId> <たartifactId> POI-OOXML-スキーマ</たartifactId> <バージョン> 4.0.1 </バージョン> </依存関係> <! - https://mvnrepository.com/artifact/commons-io/commons-io - > <依存> <groupIdを>コモンズ-IO </ groupIdを> <たartifactId>コモンズ-IO </たartifactId> <バージョン> 2.4 </バージョン> </依存関係> <! - https://mvnrepository.com/artifact/commons-lang/commons-lang - > <依存> <groupIdを>コモンズ-LANG </ groupIdを> <たartifactId>コモンズ-lang </たartifactId> <バージョン> 2.4 </ version>の </依存関係> <! - https://mvnrepository.com/artifact/com.oracle/ojdbc6 - > <依存> <groupIdを> ojdbc </ groupIdを> <たartifactId> ojdbc </たartifactId> <バージョン> 6 </バージョン> </依存> </依存関係> </プロジェクト>
このパッケージを必要とする主なポンポンがより困難に取得するようです
<依存性> <のgroupId> ojdbc </のgroupId> <たartifactId> ojdbc </たartifactId> <バージョン> 6 </バージョン> </依存>
私はシャシ侯は、パッケージを入れて参照する必要があり、この時間は、私のgithubのアップに達し、その時は、ダウンロードアドレスで利用可能なブログを、更新されます
2つの値を注意するために、データのインポートをするとき、あり
1.null
2日付値の種類を
割り当てにはnullの場合はnullについて、私の計画は、「」、プロセスがnullかどうかを決定することです
data.setStr1(row.getCell(0)== nullの "":?row.getCell(0).getStringCellValue());
日付については、私の治療プログラムは、手動変換である(ここでは、直接、データ型を使用することはできません日付が自動的に49555.4同様のデータとして計算されます、その時は、データベースなどのデータに保存されているので、我々はそれが〜この文字列を使用します)
IF(row.getCell(6)== NULL){ data.setStr7( "")。 }他{ 日付d =(日)row.getCell(6).getDateCellValue(); DateFormatのフォーマッタ=新しいてSimpleDateFormat( "YYYY-MM-DD HH:MM:SS")。 文字列、日付= formater.format(D)。 data.setStr7(日付); }