1. 程式人生 > >JDBC批處理

JDBC批處理

utils 服務 red min 利用 eat 判斷 防止 實現

批處理:

  當我們需要向數據庫中插入大量數據時,批處理會將這些數據打成多個批次addBatch(),統一發送給數據庫服務器執行executeBatch(),減少與數據庫的交互次數提高程序的執行效率。

實現批處理方法:

  利用statement對象;

  利用PreparedStatement對象;

共同使用的方法

  addBatch();

  executeBatch();

代碼:

package cn.yikuan.batch;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement; import org.junit.Test; import cn.tedu.util.JDBCUtils; /** * 這個類用來測試jdbc的批處理 * @author Administrator * */ public class BatchTest { //實現方式一:利用statement對象完成 @Test public void StatementBatch(){ Connection conn = null; Statement st = null;
try { //1.註冊驅動 //2.獲取數據庫連接 conn = JDBCUtils.getConnection(); long t = System.currentTimeMillis(); //)))1.關閉jdbc的事務管理, conn.setAutoCommit(false); //3.獲取傳輸器 st = conn.createStatement(); //4.執行sql for
(int i=0;i<1000000;i++){ String sql = "insert into dept values(null,‘"+i+"‘)"; //把sql打包成批次 st.addBatch(sql); } //統一發送給服務器執行批 int[] rows = st.executeBatch(); //)))2.手動提交事務 conn.commit(); //5.遍結果集 System.out.println(rows.length); t = System.currentTimeMillis()-t; System.out.println(t); } catch (SQLException e) { e.printStackTrace(); } finally { //6.釋放資源 JDBCUtils.close(null,st, conn); } } @Test public void psBatch(){ Connection conn = null; PreparedStatement ps = null; try { //1.註冊驅動 //2.獲取數據庫連接 conn = JDBCUtils.getConnection(); long t = System.currentTimeMillis(); //)))1.關閉jdbc的事務管理, conn.setAutoCommit(false); //3.獲取傳輸器;4.執行sql String sql = "insert into dept values(null,?)"; ps = conn.prepareStatement(sql); for (int j = 0; j < 1000000; j++) { ps.setString(1,"ps"+j); //把sql打成批次 ps.addBatch(); } //統一發送給數據庫服務器 int[] rows = ps.executeBatch(); //)))2.手動提交事務 conn.commit(); //5.遍歷結果集 System.out.println(rows.length); t = System.currentTimeMillis()-t; System.out.println(t); } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.close(null, ps, conn); } } }

JDBCUtils.java

package cn.yikuan.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
/**
 * 這個類用來提供JDBC的工具類
 * @author Administrator
 *
 */
public class JDBCUtils {
    //1.私有化構造函數,外界無法直接創建對象
    private JDBCUtils(){

    }

    static ResourceBundle rb = null;
    static {
        //讀取屬性文件
        rb = ResourceBundle.getBundle("jdbc");
    }

    //2.提供公共的,靜態的,getConnection方法,用來給外界提供數據庫連接
    public static Connection getConnection(){
        try {
            //2.1註冊驅動
            Class.forName(rb.getString("driverClass"));
            //2.2獲取數據庫連接
            String url = rb.getString("jdbcUrl");
            String user = rb.getString("user");
            String password = rb.getString("password");
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;    
    }

    //3.提供公共的,靜態的,close方法,用來釋放資源
    public static void close(ResultSet rs,Statement st,Connection conn){
        //3.1非空判斷,防止空指針異常
        //3.2手動置為空,保證完全釋放
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                rs = null;
            }
        }
        if(st != null){
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                st = null;
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                conn = null;
            }
        }

    }
}

JDBC批處理