代碼中反復(fù)開關(guān)自動(dòng)提交沒有必要. 其他方面寫得還是很不錯(cuò)的.清晰.
摘自 http://wangqinqin.iteye.com/blog/547277 

PreparedStatement

1) addBatch()將一組參數(shù)添加到PreparedStatement對(duì)象內(nèi)部。

2) executeBatch()將一批參數(shù)提交給數(shù)據(jù)庫(kù)來(lái)執(zhí)行,如果全部命令執(zhí)行成功,則返回更新計(jì)數(shù)組成的數(shù)組。

Statement

1) addBatch(String sql)方法會(huì)在批處理緩存中加入一條sql語(yǔ)句。

2) executeBatch()執(zhí)行批處理緩存中的所有sql語(yǔ)句。

注意:PreparedStatement中使用批量更新時(shí),要先設(shè)置好參數(shù)后再使用addBatch()方法加入緩存。批量更新中只能使用更改、刪除或插入語(yǔ)句。

  1Statement批量處理和事務(wù)代碼如下:   
  2package com.ambow.day20.jdbc.JDBCTestCommitAndRollback;   
  3import java.sql.Connection;   
  4import java.sql.SQLException;   
  5import java.sql.Statement;   
  6import com.ambow.day19.jdbc.util.JDBCConAndClo;   
  7/*  
  8 *1,首先把Auto commit設(shè)置為false,不讓它自動(dòng)提交  
  9 *2,進(jìn)行手動(dòng)提交(commit)  
 10 *3,提交完成后回復(fù)現(xiàn)場(chǎng)將Auto commit,還原為true,  
 11 *4,當(dāng)異常發(fā)生執(zhí)行catch中SQLException時(shí),記得要rollback(回滾);  
 12 * */
  
 13public class StatementCommitAndRollbackTest {   
 14    public static void main(String args[]) {   
 15        Connection con = null;   
 16        Statement stm = null;   
 17        try {   
 18            con = JDBCConAndClo.getConnectionBao();   
 19            stm = con.createStatement();   
 20            con.setAutoCommit(false);   
 21            // 若不出現(xiàn)異常,則繼續(xù)執(zhí)行到try語(yǔ)句完,否則跳轉(zhuǎn)到catch語(yǔ)句中   
 22            stm.addBatch("insert into student values(23,'tangbao','高數(shù)',100)");   
 23            stm.addBatch("insert into student values(24,'王定','c#',98)");   
 24            stm.addBatch("insert into student values(25,'王國(guó)云','java',90)");   
 25            stm.addBatch("insert into student values(26,'溜出','英語(yǔ)',89)");   
 26            stm.addBatch("insert into student values(27,'wqde','java',63)");   
 27            /*  
 28             * int[] executeBatch() throws  
 29             * SQLException將一批命令提交給數(shù)據(jù)庫(kù)來(lái)執(zhí)行,如果全部命令執(zhí)行成功,則返回更新計(jì)數(shù)組成的數(shù)組。  
 30             */
  
 31            stm.executeBatch();   
 32            System.out.println("插入成功!");   
 33            // commit:若成功執(zhí)行完所有的插入操作,則正常結(jié)束   
 34            con.commit();   
 35            System.out.println("提交成功!");   
 36            con.setAutoCommit(true);   
 37  
 38        }
 catch (SQLException e) {   
 39            e.printStackTrace();   
 40            try {   
 41    //rollback: 若出現(xiàn)異常,對(duì)數(shù)據(jù)庫(kù)中所有已完成的操作全部撤銷,則回滾到事務(wù)開始狀態(tài)   
 42                if (!con.isClosed()) {   
 43                    con.rollback();   
 44                    System.out.println("提交失敗,回滾!");   
 45                    con.setAutoCommit(true);   
 46                }
   
 47            }
 catch (SQLException e1) {   
 48                e1.printStackTrace();   
 49            }
 finally {   
 50                JDBCConAndClo.closeStatement(stm);   
 51                JDBCConAndClo.closeConnection(con);   
 52            }
   
 53        }
   
 54    }
   
 55}
   
 56PreparedStatement批量處理和事務(wù)代碼如下:   
 57package com.ambow.day20.jdbc.JDBCTestCommitAndRollback;   
 58import java.sql.Connection;   
 59import java.sql.PreparedStatement;   
 60import java.sql.SQLException;   
 61import com.ambow.day19.jdbc.util.JDBCConAndClo;   
 62  
 63/*  
 64 * PreparedStatement:  
 65 1.addBatch() 將一組參數(shù)添加到 PreparedStatement對(duì)象內(nèi)部  
 66 2.executeBatch() 將一批參數(shù)提交給數(shù)據(jù)庫(kù)來(lái)執(zhí)行,如果全部命令執(zhí)行成功,則返回更新計(jì)數(shù)組成的數(shù)組。  
 67 *   
 68 */
  
 69public class PreparedStatementCommitAndRollbackTest {   
 70    public static void main(String args[]) {   
 71        Connection con = null;   
 72        PreparedStatement pstm = null;   
 73  
 74        try {   
 75            // 1. 建立與數(shù)據(jù)庫(kù)的連接   
 76            con = JDBCConAndClo.getConnectionBao();   
 77            // 2. 執(zhí)行sql語(yǔ)句   
 78            // 1).先創(chuàng)建PreparedStatement語(yǔ)句(發(fā)送slq請(qǐng)求):   
 79            pstm = con.prepareStatement("insert into student values(?,?,?,?)");   
 80            con.setAutoCommit(false);//1,首先把Auto commit設(shè)置為false,不讓它自動(dòng)提交   
 81            // 2) 設(shè)置sql語(yǔ)句1   
 82            pstm.setInt(133);   
 83            pstm.setString(2,"wangqin");   
 84            pstm.setString(3"c++");   
 85            pstm.setDouble(478.5);   
 86            // 3) 將一組參數(shù)添加到此 PreparedStatement 對(duì)象的批處理命令中。   
 87            pstm.addBatch();   
 88            // 2) 設(shè)置sql語(yǔ)句2   
 89            pstm.setInt(134);   
 90            pstm.setString(2,"wuytun");   
 91            pstm.setString(3"c");   
 92            pstm.setDouble(477);   
 93            // 3) 將一組參數(shù)添加到此 PreparedStatement 對(duì)象的批處理命令中。   
 94            pstm.addBatch();   
 95            // 2) 設(shè)置sql語(yǔ)句3   
 96            pstm.setInt(131);   
 97            pstm.setString(2,"tetet");   
 98            pstm.setString(3"c++");   
 99            pstm.setDouble(490);   
100            // 3) 將一組參數(shù)添加到此 PreparedStatement 對(duì)象的批處理命令中。   
101            pstm.addBatch();   
102            // 2) 設(shè)置sql語(yǔ)句4   
103            pstm.setInt(132);   
104            pstm.setString(2,"liug");   
105            pstm.setString(3"c");   
106            pstm.setDouble(450);   
107            // 3) 將一組參數(shù)添加到此 PreparedStatement 對(duì)象的批處理命令中。   
108            pstm.addBatch();   
109            // 4) 將一批參數(shù)提交給數(shù)據(jù)庫(kù)來(lái)執(zhí)行,如果全部命令執(zhí)行成功,則返回更新計(jì)數(shù)組成的數(shù)組。   
110            pstm.executeBatch();   
111            System.out.println("插入成功!");   
112            // 若成功執(zhí)行完所有的插入操作,則正常結(jié)束   
113            con.commit();//2,進(jìn)行手動(dòng)提交(commit)   
114            System.out.println("提交成功!");   
115            con.setAutoCommit(true);//3,提交完成后回復(fù)現(xiàn)場(chǎng)將Auto commit,還原為true,   
116  
117        }
 catch (SQLException e) {   
118            e.printStackTrace();   
119            try {   
120                // 若出現(xiàn)異常,對(duì)數(shù)據(jù)庫(kù)中所有已完成的操作全部撤銷,則回滾到事務(wù)開始狀態(tài)   
121                if(!con.isClosed()){   
122                    con.rollback();//4,當(dāng)異常發(fā)生執(zhí)行catch中SQLException時(shí),記得要rollback(回滾);   
123                    System.out.println("插入失敗,回滾!");   
124                    con.setAutoCommit(true);   
125                }
   
126            }
 catch (SQLException e1) {   
127                e1.printStackTrace();   
128            }
   
129        }
finally{   
130            JDBCConAndClo.closePreparedStatement(pstm);   
131            JDBCConAndClo.closeConnection(con);   
132        }
   
133    }
   
134}
  
135