1. 程式人生 > >功能第五篇——批量處理(JDBC)

功能第五篇——批量處理(JDBC)

需要 res col dsta 添加 name call table creat

綜述

批量處理一般指批量插入,批量更新,刪除通過可以指定where條件實現。批量插入的實現方式有三種類型。statement,preparedStatement,callableStatement。

Java代碼

/**
 * 演示批量插入的三種方式
 * @throws SQLException
 */
public static void batchInsert() throws SQLException
{
  // 使用Statement對象進行批量插入,可以執行不同的sql語句
insertByStatement(); // 使用PreStatement對象進行批量插入,一條sql語句,多行參數 insertByPreparedStatement(); // 使用CallableStatement對象進行批量插入,一條存儲過程,多行參數,當表結構修改時,只需要修改存儲過程。 insertByCallableStatement(); }

Statement方式

Statement方式批量執行SQL的優點在於可以執行多條SQL語句,缺點也很明顯,需要改變SQL語句時需要修改程序,每次執行都需要重新編譯SQL。下面通過舉例說明。

示例演示往數據庫student表,book表中批量插入數據。

student表有四個字段,stu_name(學號,INTEGER類型),stu_name(名稱,varchar2(200)),stu_age(年齡,INTEGER類型),stu_class(班級,varchar2(200))。

  CREATE TABLE "STUDENT" 
   (    
       "STU_NUM" NUMBER(*,0), 
    "STU_NAME" VARCHAR2(200), 
    "STU_AGE" NUMBER(*,0), 
    "STU_CLASS" VARCHAR2(200)
   )

book表中有四個字段,num(編號,INTEGER類型),name(名稱,varchar2(200)),type(類型,varchar2(200))。

CREATE TABLE "SYSTEM"."BOOK" 
( 
  "NUM" NUMBER(*,0), 
  "NAME" VARCHAR2(200), 
  "TYPE" VARCHAR2(200)
)

Java代碼

 /**
   * 通過Statement對象進行批量插入
   * @throws SQLException
   */
  private static void insertByStatement() throws SQLException
  {
    // 獲取連接對象
    Connection conn = ConnectionUtil.getConn();
    // 獲取Statement對象
    Statement state = conn.createStatement();
    // 不同的sql語句,不同的表, studentSql為插入student表,bookSql為插入book表
    // stu_num(學號),stu_name(名稱),stu_age(年齡),stu_class("班級")
    String studentSql = "insert into student values(1,‘test1‘,25,‘333班‘)";
    // num(圖書編號),name(名稱),type(類型)
    String bookSql = "insert into book values(1,‘book1‘,‘雜誌‘)";
    // 添加sql語句,
    state.addBatch(studentSql);
    state.addBatch(bookSql);
    // 執行sql
    state.executeBatch();
    // 清空批量
    state.clearBatch();
    // 關閉statement對象
    state.close();
  }

PreparedStatement方式

PreparedStatement優點是SQL語句結構不變,並且經過預編譯,所以一般適用於一條SQL語句,多行參數。對於插入場景很適用。但是需要知道表中擁有哪些字段,如何設置這些值,如果表結構修改,需要修改代碼。

Java代碼

/**
 * 通過PreparedStatement對象進行批量插入
 * @throws SQLException
 */
private static void insertByPreparedStatement() throws SQLException
{
  // 獲取連接對象
  Connection conn = ConnectionUtil.getConn();
  // 插入Sql語句
  String insertSql = "insert into student values(?,?,?,?)";
  // 獲取PreparedStatement對象
  PreparedStatement preStatement = conn.prepareStatement(insertSql);
  // 設置參數
  for(int i=2;i<100;i++)
  {
    // 添加批量執行批量,相比於Statement的方式,一條sql語句,多行參數,適用於單表插入
    setPreparedStatementParam(preStatement, i, "test"+i, 23, "333班");
    preStatement.addBatch();
  }

  preStatement.executeBatch();
  // 清空批量,關閉對象
  preStatement.clearBatch();
  preStatement.close();
}

/**
 * 為PreparedStatement對象設置參數
 * @param preStatement PreParedStament對象
 * @param stuNum 學號
 * @param name 姓名
 * @param age 年齡
 * @param stuClass 班級
 * @throws SQLException 
 */
private static void setPreparedStatementParam(PreparedStatement preStatement, int stuNum, String name, int age,
        String stuClass) throws SQLException
{
  preStatement.setInt(1, stuNum);
  preStatement.setString(2, name);
  preStatement.setInt(3, age);
  preStatement.setString(4, stuClass);
}

CallableStatement方式

CallableStatement的方式優點在於只需要了解存儲過程中的使用,不需要了解表結構,當表結構改變時,不用修改程序.

存儲過程

create or replace procedure insertStudentProc
(stu_num in INTEGER,name in varchar2)
as 
begin
  insert into student values(stu_num,name,25,‘存儲過程‘);
  commit;
end;

Java代碼

/**
 * 通過CallableStatement對象進行批量插入
 * @throws SQLException 
 */
private static void insertByCallableStatement() throws SQLException 
{
  // 獲取連接對象
  Connection conn = ConnectionUtil.getConn();
  // 第一個參數為學號,第二個參數為名稱
  String callSql = "{call insertStudentProc(?,?)}";
  // 創建CallableStatement對象
  CallableStatement callStatement = conn.prepareCall(callSql);
  // 設置參數
  for(int i=100;i<200;i++)
  {
    setCallableStatementParam(callStatement, i, "test"+i);
    callStatement.addBatch();
  }
  // 執行批量操作
  callStatement.executeBatch();
  // 清空批量,關閉對象
  callStatement.clearBatch();
  callStatement.close();
}


/**
 * 為CallableStatement對象設置參數
 * @param callStatement CallableStatement對象
 * @param stuNum 學號
 * @param name 姓名
 * @throws SQLException 
 */
private static void setCallableStatementParam(CallableStatement callStatement,int stuNum,String name) throws SQLException
{
  callStatement.setInt(1, stuNum);
  callStatement.setString(2, name); 
}

至此本篇內容結束

功能第五篇——批量處理(JDBC)