JDBC操作數據庫的批處理


在JDBC開發中,操作數據庫需要與數據庫建立連接,然后將要執行的SQL語句傳送到數據庫服務器,最后關閉數據庫連接,都是按照這樣一個流程進行操作的。如果按照該流程執行多條SQL語句,那么就需要建立多個數據庫連接,這樣會將時間浪費在數據庫連接上。針對這一問題,JDBC的批處理提供了很好的解決方案。

JDBC中批處理的原理是將批量的SQL語句一次性發送到數據庫中進行執行,從而解決多次與數據庫連接所產生的速度瓶頸。

例1.1 創建學生信息表,通過JDBC的批處理操作,一次性將多個學生信息寫入到數據庫中。

(1)創建學生信息表tb_student_batch,其結構如下所示:

(2)創建名稱為Batch的類,該類用於實現對學生信息的批量添加操作。首先在Batch類中編寫getConnection()方法,用於獲取數據庫連接Connection對象,其關鍵代碼如下:

/**
     * 獲取數據庫連接
     * @return Connection 對象
     */
    public Connection getConnection(){
        Connection conn=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/stu";
            String user = "root";
            String password = "1234";
            conn=DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }

然后編寫saveBatch()方法,實現批量添加學生信息功能,實例中主要通過PreparedStatement對象批量添加學生信息。關鍵代碼如下:

/**
     * 批量添加數據
     * @return 所影響的行數
     */
    public int saveBatch(){
        int row=0;
        Connection conn=getConnection();
        try {
            String sql = "insert into tb_student_batch(id,name,sex,age) values(?,?,?,?)";
            PreparedStatement ps = conn.prepareStatement(sql);
            Random random = new Random();
            for(int i=0;i<10;i++){
                ps.setInt(1, i+1);
                ps.setString(2, "學生"+i);
                ps.setBoolean(3, i%2==0?true:false);
                ps.setInt(4, random.nextInt(5)+10);
                ps.addBatch(); //添加批處理命令
            }
            int[] rows = ps.executeBatch(); //執行批處理操作並返回計數組成的數組
            row = rows.length;
            ps.close();
            conn.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return row; //返回添加的行數
    }

注意:PreparedStatement對象的批處理操作調用的是executeBatch()方法,而不是execute()方法或者executeUpdate()方法。

(3)創建程序中的首頁面index.jsp,在該頁面中通過<jsp:useBean>實例化Batch對象,並執行批量添加數據操作。關鍵代碼如下:

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  
  <body>
    <jsp:useBean id="batch" class="com.cn.gao.Batch"></jsp:useBean>
    <%
        //執行批量插入操作
        int row = batch.saveBatch();
        out.print("批量插入了【"+row+"】條數據");
     %>
  </body>
</html>

實例運行后,程序向數據庫批量添加了10條學生信息數據,其運行結果如下圖所示:

運行成功后,可以打開數據表tb_student_batch進行查看,其效果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM