日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA基础知识之JDBC——JDBC事务处理及批量更新

發布時間:2024/6/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA基础知识之JDBC——JDBC事务处理及批量更新 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JDBC事務

JDBC的事務由Connection提供,默認是打開的。

要開啟事務,則要關閉自動提交,

1 conn.setAutoCommit(false);

提交事務使用

1 conn.commit();

回滾事務使用

1 conn.rollback();

可以在某個位置設置一個保存點,回滾時只回滾到這個點,

1 try { 2 Savepoint sp = conn.setSavepoint(); 3 ... 4 } catch (SQLException e) { 5 conn.rollback(sp); 6 }

當Connection遇到一個未處理的SQLException異常時,系統會非正常退出,事務還是會自動回滾。但如果程序捕獲了該異常,則需要在異常處理塊中顯示地回滾。

下面演示JDBC事務的基本用法,

1 package db; 2 3 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.IOException; 7 import java.sql.Connection; 8 import java.sql.DriverManager; 9 import java.sql.SQLException; 10 import java.sql.Statement; 11 import java.util.Properties; 12 13 public class TransactionTest { 14 private String driver; 15 private String url; 16 private String user; 17 private String pass; 18 public void initParam(String paramFile) throws FileNotFoundException, IOException, ClassNotFoundException { 19 //用Properties類加載屬性文件 20 Properties prop = new Properties(); 21 prop.load(new FileInputStream(paramFile)); 22 driver = prop.getProperty("driver"); 23 url = prop.getProperty("url"); 24 user = prop.getProperty("user"); 25 pass = prop.getProperty("pass"); 26 Class.forName(driver); 27 } 28 public void insertInTransaction(String[] sqls) throws SQLException{ 29 try (Connection conn = DriverManager.getConnection(url, user, pass)) { 30 //關閉自動提交,即開啟事務 31 conn.setAutoCommit(false); 32 try (Statement stmt = conn.createStatement()) { 33 for (String sql : sqls) { 34 stmt.executeUpdate(sql); 35 } 36 //提交事務 37 conn.commit(); 38 }catch (SQLException e) { 39 conn.rollback(); 40 System.out.println("Exception:"); 41 System.out.println(e.getMessage()); 42 } 43 } 44 } 45 public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, IOException, SQLException { 46 TransactionTest tt = new TransactionTest(); 47 tt.initParam("mysql.ini"); 48 String[] sqls = new String[] { 49 "insert into jdbc_test values (null, 'aaa','111')", 50 "insert into jdbc_test values (null, 'bbb', '222')", 51 "insert into jdbc_test values (null, 'ccc', '333')", 52 //下面這條sql會失敗,因為已經存在主鍵為2的記錄 53 "insert into jdbc_test values (2, 'ddd','444')" 54 }; 55 tt.insertInTransaction(sqls); 56 } 57 }

上面的第53行sql會引發SQLException異常, 因此前面三個insert都會被回滾, 程序執行如下,

1 Exception: 2 Duplicate entry '2' for key 'PRIMARY'

JDBC批量更新

使用批量更新時,多條sql語句將被作為同一批操作被同時收集,同時提交。

使用Statement收集sql的方法為

1 stmt.addBatch(sql1); 2 stmt.addBatch(sql1); 3 stmt.addBatch(sql1); 4 ...

同時執行所有sql的方法為執行Statement的executeBatch(). ?(JDK.8中如果執行影響記錄太多,則可以用executeLargeBatch()方法)

stmt.executeBatch();

之后可以提交更新,為了達到批量更新的目的,程序應該在批量操作之前關閉自動提交,然后收集sql,當批量操作執行之后,提交事務,并恢復之前的自動提交模式。

關鍵代碼如下,

1 public void insertInTransaction(String[] sqls) throws SQLException{ 2 try ( Connection conn = DriverManager.getConnection(url, user, pass)) { 3 //關閉自動提交,即開啟事務 4 conn.setAutoCommit(false); 5 try(Statement stmt = conn.createStatement()) { 6 for (String sql : sqls) { 7 stmt.addBatch(sql); 8 } 9 stmt.executeBatch(); 10 //提交事務 11 conn.commit(); 12 } catch (SQLException e) { 13 conn.rollback(); 14 System.out.println("Exception:"); 15 System.out.println(e.getMessage()); 16 } finally { 17 conn.setAutoCommit(true); 18 } 19 } 20 }

?

轉載于:https://www.cnblogs.com/fysola/p/6186615.html

總結

以上是生活随笔為你收集整理的JAVA基础知识之JDBC——JDBC事务处理及批量更新的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。