Java實現Excel數據批量導入數據庫

Java實現Excel數據批量導入數據庫

 

概述:

這個小工具類是工做中的一個小插曲哦,由於提數的時候須要跨數據庫導數... 有的是須要從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);
   }
相關文章
相關標籤/搜索