這個小工具類是工做中的一個小插曲哦,由於提數的時候須要跨數據庫導數... 有的是須要從oracle導入mysql ,有的是從mysql導入oraclejava
實踐以後咱們會發現 使用navicat工具鏈接mysql數據庫, 從oracle數據庫中導出數據爲csv格式,再導入mysql是很快的,大概是分分鐘的問題吧mysql
可是當咱們使用plsql鏈接oracle數據庫,而後在mysql數據庫中導出sql文件形式的數據想要插入oracle的時候,就很慢了..... 我通常是5萬條的數據 6個字段,在開啓命令窗口執行須要執行差很少2小時~ 這個真的太可怕了 並且有時候工具備問題,還被迫中斷.... 又要從新開始... 效率過低了git
因此有了如下導數工具類.github
新建maven項目,項目名稱可自定義哦sql
ExecuteDataExcelToOracle.java 類,使用的時候直接執行main方法便可數據庫
須要替換你的Excel文件apache
須要替換你的數據庫鏈接信息oracle
須要替換你的表信息,以及字段 (這裏字段還與內部了 Data相關哦,若是你須要導入的字段大於10個請本身繼續添加哈~)maven
主要作了如下幾件事:工具
1.解析Excel文件,將Excel文件中的數據逐條的放入對象中
2. 鏈接數據庫,將數據插入數據庫
經過此工具類導入數據,5萬條數據大概只要2分鐘吧,並且大部分時間都是花在解析excel上~,效率簡直不是通常的高哈哈哈哈~
package com.imodule.dataImport.dataImport.main; import java.io.File; import java.io.FileInputStream; import java.io.Serializable; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.Date; import org.apache.commons.lang.StringUtils; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; public class ExecuteDataExcelToOracle { public static void main(String[] args) { try { List<Data> datas = loadExcel("C:/Users/xxxx/Desktop/aa.xlsx");//須要替換 batchInsert(datas); } catch (Exception e) { e.printStackTrace(); } } /** * 獲取excel中的數據 * @param filepath * @return * @throws Exception */ public static List<Data> loadExcel(String filepath) throws Exception{ File file = new File(filepath); Workbook wb = WorkbookFactory.create(new FileInputStream(file)); Sheet sheet = wb.getSheetAt(0); List<Data> datas = new ArrayList<>();//將數據添加到數據一行一行的添加到集合中,做爲插入數據的入參 Row row = null; for (int i = 1; i <= sheet.getLastRowNum(); i++) { System.out.println("i="+i); row = sheet.getRow(i); if(row == null || StringUtils.isEmpty(row.getCell(0).getStringCellValue())){ continue; } Data data = new ExecuteDataExcelToOracle().new Data(); 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).getStringCellValue()); data.setStr6(row.getCell(5) == null? "":row.getCell(5).getStringCellValue()); // row.getCell(5).setCellType(CellType.STRING); if(row.getCell(6) == null){ data.setStr7(""); }else{ Date d = (Date) row.getCell(6).getDateCellValue(); DateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = formater.format(d); data.setStr7(date); } 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(data); } return datas; } /** * 批量執行插入數據 * @param datas */ public static void batchInsert(List<Data> datas){ long startTime = System.currentTimeMillis(); Connection conn = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); //若是是oracle就不須要替換,若是是mysql就須要替換 conn=DriverManager.getConnection("jdbc:oracle:thin:@10.11.22.33:1521:demo", "root","111"); //須要替換 conn.setAutoCommit(false); PreparedStatement stmt = conn.prepareStatement("INSERT INTO temp_user_info VALUES (?,?,?,?,?,?,?,?,?,?)"); //須要替換 //System.out.println("數據大小:" + datas.size()); int num = 0; for (Data v : datas) { num++; stmt.setString(1, v.getStr1()); stmt.setString(2, v.getStr2()); stmt.setString(3, v.getStr3()); stmt.setString(4, v.getStr4()); 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(); } catch (Exception e) { e.printStackTrace(); try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); System.out.println("方法執行時間:" + (endTime - startTime) + "ms"); } } class Data implements Serializable{ private static final long serialVersionUID = 1L; private String str1; private String str2; private String str3; private String str4; private String str5; private String str6; private String str7; private String str8; private String str9; private String str10; public String getStr7() { return str7; } public void setStr7(String str7) { this.str7 = str7; } public String getStr8() { return str8; } public void setStr8(String str8) { this.str8 = str8; } public String getStr9() { return str9; } public void setStr9(String str9) { this.str9 = str9; } public String getStr10() { return str10; } public void setStr10(String str10) { this.str10 = str10; } public String getStr1() { return str1; } public void setStr1(String str1) { this.str1 = str1; } public String getStr2() { return str2; } public void setStr2(String str2) { this.str2 = str2; } public String getStr3() { return str3; } public void setStr3(String str3) { this.str3 = str3; } public String getStr4() { return str4; } public void setStr4(String str4) { this.str4 = str4; } public String getStr5() { return str5; } public void setStr5(String str5) { this.str5 = str5; } public String getStr6() { return str6; } public void setStr6(String str6) { this.str6 = str6; } } }
pom.xml
<project 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> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>dataImport</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- poi 相關 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>4.0.1</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.4</version> </dependency> <!-- https://mvnrepository.com/artifact/com.oracle/ojdbc6 --> <dependency> <groupId>ojdbc</groupId> <artifactId>ojdbc</artifactId> <version>6</version> </dependency> </dependencies> </project>
這個pom裏面須要主要這個包好像比較難拿到
<dependency> <groupId>ojdbc</groupId> <artifactId>ojdbc</artifactId> <version>6</version> </dependency>
這個我看看啥時候有時間就把這個包傳到我github上去,到時候會更新博客,提供下載地址的
還有一個就是在導入數據的時候須要注意兩個值
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(""); }else{ Date d = (Date) row.getCell(6).getDateCellValue(); DateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = formater.format(d); data.setStr7(date); }