1. 程式人生 > >java連線mysql資料庫實現單條插入和批量插入

java連線mysql資料庫實現單條插入和批量插入

1、連線資料庫

package com.njupt.ymh;

import java.sql.DriverManager;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
 
public class Connect_MySQL {
 
	private static final String URL="jdbc:mysql://127.0.0.1:3306/news";  // 一般預設3306,這裡設定成6666  (33060)  MYSQL8  WMPNetworkSvc
	private static final String  USER="root";
	private static final String  PASSWORD="12345";
	private static Connection connection=null;
 
	static{
		//1、載入驅動程式(反射的方法)
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		//2、連線資料庫
		try {
		connection=(Connection) DriverManager.
					getConnection(URL, USER,PASSWORD);//地址,使用者名稱,密碼
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public static Connection getConnection(){
		return connection;
	}
	
}

 2、單條插入

package com.njupt.ymh;
/**
 * 單條插入資料
 */

import java.sql.SQLException;
import java.util.List;

import com.mysql.jdbc.Connection;

public class OperationPaper {

	private static Connection connection=Connect_MySQL.getConnection();
	
	public void addNewsPaper(NewsPaper newsPaper){//增
		// connection = Connect_MySQL.getConnection();
		String sql="insert into papertest (id, date, title, lead_pargraph, full_text) values(?, ?, ?, ?, ?)";
		
			java.sql.PreparedStatement ptmt = null;
			try {
				ptmt = connection.prepareStatement(sql);
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			
			try {
				ptmt.setLong(1, newsPaper.getID());
				ptmt.setString(2, newsPaper.getDate());
				ptmt.setString(3, newsPaper.getTitle());
				ptmt.setString(4, newsPaper.getLead());
				ptmt.setString(5, newsPaper.getfull());
				ptmt.execute();//執行給定的SQL語句,該語句可能返回多個結果
			
			} catch (SQLException e) {
				e.printStackTrace();
			}
	}
	public static void main(String[] args) {
		OperationPaper operationPaper = new OperationPaper();
		List<String> listFile = SearchFile.getAllFile("E:\\huadai\\1996\\07\\21", false); // 檔案列表
		
		for (String string : listFile) {   
			NewsPaper newsPaper = new NewsPaper(string);
			if (newsPaper.isUseful()) 
				operationPaper.addNewsPaper(newsPaper);  //  插入資料庫
		}
	}

}

3、批量插入

package com.njupt.ymh;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.mysql.jdbc.Connection;

public class OperaOnNewsPaper implements Cloneable{

private static Connection connection=Connect_MySQL.getConnection();
	

	/**
	 * 支援批量插入資料
	 * @param newsPaper
	 */
	
	public void addNewsPaper(ArrayList<NewsPaper> listNewsPaper){//增
		String sql="insert into papertest (id, date, title, lead_pargraph, full_text) values(?, ?, ?, ?, ?)";
		java.sql.PreparedStatement ptmt = null;
		
		try {
			connection.setAutoCommit(false);// 關閉事務
			ptmt = connection.prepareStatement(sql);
		
		} catch (SQLException e2) {
			e2.printStackTrace();
		} 

		for (NewsPaper paperaper : listNewsPaper) {
			
			try {
				ptmt.setLong(1, paperaper.getID());
				ptmt.setString(2, paperaper.getDate());
				ptmt.setString(3, paperaper.getTitle());
				ptmt.setString(4, paperaper.getLead());
				ptmt.setString(5, paperaper.getfull());
				ptmt.addBatch();	
				}	
			catch (SQLException e) {
				e.printStackTrace();
			}
		}
		try {
			ptmt.executeBatch();//執行給定的SQL語句,該語句可能返回多個結果
			connection.commit();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	public static void main(String[] args) {
		OperaOnNewsPaper operation = new OperaOnNewsPaper();
		List<String> listFile = SearchFile.getAllFile("E:\\huadai\\2007", false); // 檔案列表
		ArrayList<NewsPaper> listPaper = new ArrayList<>();
		int count = 0;
		int sizenum = 1000;
		for (String string : listFile) {
			NewsPaper newsPaper = new NewsPaper(string);
			
			if (newsPaper.isUseful()) {
				count++;
				listPaper.add(newsPaper);    // 新聞列表
				if (count % sizenum == 0) {
					//System.out.println("ok");
					System.out.println("    " + count);
					operation.addNewsPaper(listPaper); //插入資料庫
					
					System.out.println(count);
					listPaper.clear();
				}
			}	
		}
		if (count %sizenum != 0) {
			operation.addNewsPaper(listPaper);
			System.out.println("zui hou ");
		}		
	}
}


通過實際測試,大概十萬級資料批量插入要不單條插入節省10分鐘左右時間。因為每次單條插入就要和資料庫建立一次連線,進行一次日誌更新。但是,如果批量插入過程中,批量的資料值有一條不符合格式就將導致本次批量插入整體失敗,因此需要對失敗情況進行處理,或者對批量插入的資料進行預處理,保證批量插入能夠成功。