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