問題:
向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作為數據庫的話,那麼就會沒有問題的。