程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 使用JDBC連接MySQL數據庫--典型案例分析(七)----批量插入員工信息

使用JDBC連接MySQL數據庫--典型案例分析(七)----批量插入員工信息

編輯:MySQL綜合教程

使用JDBC連接MySQL數據庫--典型案例分析(七)----批量插入員工信息


問題:

向Emp表中批量插入100條數據,需要插入數據的列為empno,ename以及sal.這三個字段對應的數據分別為empno列的數據通過序列emp_seq自動生成,ename列的數據為字符串 "name"+循環次數i組成、sal的數據有隨機生成的10000以內的整數構成。

方案:

每循環一次,向數據庫插入一條數據,頻繁的訪問數據庫,效率很低。

在java中專門提供的批處理的API。在對數據庫頻繁操作時,可以使用JDBC批處理方式提高程序的效率。批處理的主要特點如下:

1.使用同一Connection資源,一次發送多條SQL語句執行。

2.提高應用程序與DB之間的吞吐量,縮短DB的響應時間

3.與逐條執行SQL的方式相比,需要處理的數據量越大,批處理的優勢越明顯

實現緩存SQL語句和批量執行,使用Statement實現批處理的核心代碼如下:

步驟一:在Mysql數據中創建序列emp_seq

在Mysql數據庫中創建序列名為emp_sql,該序列的起始值為1,步進為1,SQL語句如下所示:

 

CREATE TABLE emp_seq ( seq VARCHAR(8));
INSERT INTO emp_seq VALUES('0');
UPDATE emp_seq SET seq = LAST_INSERT_ID(seq+1);
SELECT LAST_INSERT_ID();

 

步驟二:准備JDBC操作數據庫的基本代碼

 

 

首先新建類Batch,在該類中新建batchAdd方法,然後,准備數據庫連接Connection對象,操作SQL語句的Statement對象以及設置事務管理;最後進行異常的處理,代碼如下所示:

 

package Account;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;

import dao.ConnectionSource;
public class Batch {
		public static void main(String [] args){
			
		}
	
		public void batchAdd(){
			Connection con=null;
			Statement stmt=null;
			String sql=null;
			try {
				con=ConnectionSource.getConnection();
				stmt=con.createStatement();
				//關閉自動提交
				con.setAutoCommit(false);
				// 提交
				con.commit();
			} catch (SQLException e) {
				System.out.println("數據庫訪問異常!");
				throw new RuntimeException(e);
			}finally{
				try {
					if(stmt!=null){
						stmt.close();
					}
					if(con!=null){
						con.close();
					}
				} catch (SQLException e) {
					System.out.println("釋放資源時發生異常!");
				}
			}
		}
}
步驟三:批量向Emp表中插入數據

 

使用statement的addBatch方法和executeBatch方法,批量向Emp表中插入數據,代碼如下所示:

 

package Account;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;

import dao.ConnectionSource;
public class Batch {
		public static void main(String [] args){
			
		}
	
		public void batchAdd(){
			Connection con=null;
			Statement stmt=null;
			String sql=null;
			try {
				con=ConnectionSource.getConnection();
				stmt=con.createStatement();
				//關閉自動提交
				con.setAutoCommit(false);
				for(int i=0;i<100;i++){
					//插入數據的sql語句
					sql="insert into emp(empno,ename,sal) values("+"emp_seq.nextval,'name"+i+"',"+new Random().nextInt(10000)+")";
					//將sql語句加入到Batch中
					stmt.addBatch(sql);
				}
				//執行批處理
				stmt.executeBatch();
				// 提交
				con.commit();
			} catch (SQLException e) {
				System.out.println("數據庫訪問異常!");
				throw new RuntimeException(e);
			}finally{
				try {
					if(stmt!=null){
						stmt.close();
					}
					if(con!=null){
						con.close();
					}
				} catch (SQLException e) {
					System.out.println("釋放資源時發生異常!");
				}
			}
		}
}

 

步驟四:測試是否批量插入數據成功

 

public static void main(String [] args){
			Batch batch=new Batch();
			batch.batchAdd();
		}

 

運行前:\

運行後:

結果有點問題,上述代碼中有一句是orcle的函數功能,

emp_seq.nextval

目前還沒有找到合適的能運行的類似解決方法,如果你是用orcle作為數據庫的話,那麼就會沒有問題的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved