JDBC實現SQL語句的批處理

啥是批處理

將多條SQL添加到一個批中,一次性將批發送給數據庫,數據庫依次執行SQL語句,減小SQL語句發送的次數,提高程序運行的效率。java

Statement批處理

優勢:sql

  • 能夠在一次批處理中處理不一樣語義的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批處理

優勢:

  • 預編譯機制,能夠防止注入攻擊,且執行效率較高
  • 當發送多條結構相同的SQL時,SQL語句的骨架能夠只發一次。

缺點:

  • 不能在一次批處理中添加結構不一樣的SQL語句。
//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。

相關文章
相關標籤/搜索