在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進行查看,其效果如下: