在實際的項目開發中,有時候須要向數據庫發送一批SQL語句執行,這時應避免向數據庫一條條的發送執行,而應採用JDBC的批處理機制,以提高執行效率。
JDBC實現批處理有兩種方式:statement和preparedstatementjava
一、使用Statement對象添加要批量執行SQL語句,以下:sql
1 Statement.addBatch(sql1); 2 Statement.addBatch(sql2); 3 Statement.addBatch(sql3);
二、執行批處理SQL語句:Statement.executeBatch();
三、清除批處理命令:Statement.clearBatch();數據庫
一、編寫測試的SQL腳本建立表測試
1 create table testbatch 2 ( 3 id int primary key, 4 name varchar(20) 5 );
二、編寫測試代碼,以下所示:spa
1 package me.gacl.demo; 2 3 import java.sql.Connection; 4 import java.sql.ResultSet; 5 import java.sql.Statement; 6 import me.gacl.utils.JdbcUtils; 7 import org.junit.Test; 8 9 /** 10 * @ClassName: JdbcBatchHandleByStatement 11 * @Description: 使用Statement實現JDBC批處理操做 12 * @author: 孤傲蒼狼 13 * @date: 2014-9-20 下午10:05:45 14 * 15 */ 16 public class JdbcBatchHandleByStatement { 17 18 @Test 19 public void testJdbcBatchHandleByStatement(){ 20 Connection conn = null; 21 Statement st = null; 22 ResultSet rs = null; 23 try{ 24 conn = JdbcUtils.getConnection(); 25 String sql1 = "insert into testbatch(id,name) values(1,'aaa')"; 26 String sql2 = "insert into testbatch(id,name) values(2,'bbb')"; 27 String sql3 = "insert into testbatch(id,name) values(3,'CCC')"; 28 String sql4 = "insert into testbatch(id,name) values(4,'DDD')"; 29 String sql5 = "update testbatch set name='gacl' where id=1"; 30 String sql6 = "insert into testbatch(id,name) values(5,'FFF')"; 31 String sql7 = "delete from testbatch where id=2"; 32 st = conn.createStatement(); 33 //添加要批量執行的SQL 34 st.addBatch(sql1); 35 st.addBatch(sql2); 36 st.addBatch(sql3); 37 st.addBatch(sql4); 38 st.addBatch(sql5); 39 st.addBatch(sql6); 40 st.addBatch(sql7); 41 //執行批處理SQL語句 42 st.executeBatch(); 43 //清除批處理命令 44 st.clearBatch(); 45 }catch (Exception e) { 46 e.printStackTrace(); 47 }finally{ 48 JdbcUtils.release(conn, st, rs); 49 } 50 } 51 }
採用Statement.addBatch(sql)方式實現批處理:
優勢:能夠向數據庫發送多條不一樣的SQL語句。
缺點:SQL語句沒有預編譯。
當向數據庫發送多條語句相同,但僅參數不一樣的SQL語句時,需重複寫上不少條SQL語句。例如:code
1 Insert into user(name,password) values('aa','111'); 2 Insert into user(name,password) values('bb','222'); 3 Insert into user(name,password) values('cc','333'); 4 Insert into user(name,password) values('dd','444');
測試代碼以下:對象
1 package me.gacl.demo; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import me.gacl.utils.JdbcUtils; 7 import org.junit.Test; 8 9 /** 10 * @ClassName: JdbcBatchHandleByStatement 11 * @Description: 使用prepareStatement實現JDBC批處理操做 12 * @author: 孤傲蒼狼 13 * @date: 2014-9-20 下午10:05:45 14 * 15 */ 16 public class JdbcBatchHandleByPrepareStatement { 17 18 @Test 19 public void testJdbcBatchHandleByPrepareStatement(){ 20 long starttime = System.currentTimeMillis(); 21 Connection conn = null; 22 PreparedStatement st = null; 23 ResultSet rs = null; 24 25 try{ 26 conn = JdbcUtils.getConnection(); 27 String sql = "insert into testbatch(id,name) values(?,?)"; 28 st = conn.prepareStatement(sql); 29 for(int i=1;i<1000008;i++){ //i=1000 2000 30 st.setInt(1, i); 31 st.setString(2, "aa" + i); 32 st.addBatch(); 33 if(i%1000==0){ 34 st.executeBatch(); 35 st.clearBatch(); 36 } 37 } 38 st.executeBatch(); 39 }catch (Exception e) { 40 e.printStackTrace(); 41 }finally{ 42 JdbcUtils.release(conn, st, rs); 43 } 44 long endtime = System.currentTimeMillis(); 45 System.out.println("程序花費時間:" + (endtime-starttime)/1000 + "秒!!"); 46 } 47 }
採用PreparedStatement.addBatch()實現批處理
優勢:發送的是預編譯後的SQL語句,執行效率高。
缺點:只能應用在SQL語句相同,但參數不一樣的批處理中。所以此種形式的批處理常常用於在同一個表中批量插入數據,或批量更新表的數據。blog
關於JDBC批處理的內容就總結這麼多。ip