將多條SQL添加到一個批中,一次性將批發送給數據庫,數據庫依次執行SQL語句,減小SQL語句發送的次數,提高程序運行的效率。java
優勢:sql
缺點:數據庫
沒有預編譯機制,不能防止sql注入攻擊,且執行效率低。數組
SQL語句沒法預留在數據庫服務器中,每次都是新發送一條SQL語句到達數據庫,須要從新解讀SQL語句。服務器
//Statement實現批處理操做 public static void main(String[] args) { //try-with-resource try (Connection conn = JDBCUtils.getConnection(); Statement stat = conn.createStatement()) { //添加進批 stat.addBatch("create table t1(id int,name varchar(20))"); stat.addBatch("insert into t1 values(1,'a')"); stat.addBatch("insert into t1 values(2,'b')"); stat.addBatch("insert into t1 values(3,'c')"); //執行批 int[] counts = stat.executeBatch(); //long[] longs = stat.executeLargeBatch(); System.out.println(Arrays.toString(counts)); } catch (SQLException e) { e.printStackTrace(); } }
void addBatch( String sql );添加進批,其實就是一個List中。code
int[] executeBatch();執行批處理get
須要注意的是,excuteBatch()不支持Select語句,否則會以下錯誤:it
java.sql.BatchUpdateException: Can not issue SELECT via executeUpdate() or executeLargeUpdate().
Java8對批處理的方法進行了加強:long[] longs = stat.executeLargeBatch();
io
executeLargeBatch()
方法將返回一個long類型的數組,很好理解,由於配套的單個處理的executeLargeUpdate()
返回的是單個的long型。若是SQL語句的返回結果大於Integer.MAX_VALUE
的話能夠用這個,固然,一樣不支持select語句。編譯
優勢:
缺點:
//PreparedStatement實現批處理操做 public static void main(String[] args) { String sql = "insert into t1 values(?,?)"; try (Connection conn = JDBCUtils.getConnection(); PreparedStatement pstat = conn.prepareStatement(sql)) { for (int i = 0; i < 100; i++) { pstat.setInt(1, i); pstat.setString(2, i + ""); pstat.addBatch(); if (i % 10 == 0) { //滿10條 執行批處理 pstat.executeBatch(); //每10條執行完,釋放 pstat.clearBatch(); } } //保證全部都能執行一次 pstat.executeBatch(); } catch (SQLException e) { e.printStackTrace(); } }
void clearBatch();清空當前批中的statement。