功能第五篇——批量處理(JDBC)
阿新 • • 發佈:2017-06-09
需要 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)