Statement與preparedStatement用法深入之批處理
我們可以通過使用 Statement或preparedStatement的物件來執行相應的sql語句,但是有時,當我們需要向資料庫傳送一批SQL語句執行時,為了避免向資料庫一條條的傳送執行,我們就應該採用JDBC的批處理機制,以提升執行效率。
實現批處理有兩種方式,第一種方式:Statement物件
Statement.addBatch(sql)
例如:我們在在向一個名為me的表中輸一批入資料時我們就可以採用批處理來實現。
Connection con =null;
Statement st=null;
ResultSet rs=null;
PreparedStatement ps
publicvoid statementBanch(){
con = DBCManager.getConnect();//獲取連線物件
try {
//定義sql語句
String sql = "insertinto me (id,name,age ) values(1,'lisi',13)";
String sql1 = "update me set id =2,name ='zhangsan',age =14 whereid =1";
//建立語句物件
st =con.createStatement();
//新增進批
st.addBatch(sql);
st.addBatch(sql1);
//執行批
st.executeBatch();
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
DBCManager.release(null, null, con);
}
這樣我們就完成了對於一批有不同的sql句的資料的插入。
但是,還有時候,我們需要向資料庫傳送的多條語句相同,但僅引數不同的SQL語句時,需重複寫上很多條SQL語句,如:
Insert into user(name,password) values(‘aa’,’111’);
Insert into user(name,password) values(‘bb’,’222’);
Insert into user(name,password) values(‘cc’,’333’);
Insert into user(name,password) values(‘dd’,’444’);
這就大大的降低了程式執行的效率,且所有SQL語句沒有進行預編譯,這樣是很不好的,因此,我們便需要藉助第二種方式來進行對具有相同特徵的一批資料的插入工作。也就是,使用PrepareStatement物件來實現,這種整批資料的錄入。
例:
publicvoid prepareStatementBanch(){
con = DBCManager.getConnect();//獲取連線物件
try {
//定義sql語句
String sql = "insert into me (id,name,age ) values(?,?,?)";
//建立語句物件
ps =con.prepareStatement(sql);
for(int i=0;i<=10;i++){
//為欄位賦值
ps.setInt(1, i+1);
ps.setString(2, "name"+i);
ps.setInt(3, 10+i);
//新增進批
ps.addBatch();
//設定條件當i對10取餘為0時,先執行一次批語句,然後將批清除
if(i%10==0){
ps.executeBatch();
ps.clearBatch();
}
}
//將批中剩餘的語句執行完畢
ps.executeBatch();
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
DBCManager.release(null, ps, con);
}
這樣通過採用PreparedStatement.addBatch()實現批處理,傳送出去的是通過預編譯後的SQL語句,執行起來效率會更高。當然,這樣做也有它的不足之處即:只能應用在SQL語句相同,但引數不同的批處理中。因此此種形式的批處理經常用於在同一個表中批量插入資料,或批量更新表的資料。
這樣我們以後就可以通過幾種不同的方式來實現對於不同型別、不同數量的資料的插入了。