- 事物處理
- 批量更新
- 返回自動主鍵
- DAO
1,事物處理
什麼是事物?java
事務(Transaction):數據庫中保證交易可靠的機制。JDBC支持數據庫中的事務概念,而且在JDBC中,事務默認是自動提交的。mysql
事務提交的方式有兩種:sql
- 顯示提交:使用commit;
- 自動提交:執行DDL或DCL語句,或者程序正常退出;
當事務所包含的任意一個數據庫操做執行失敗後,應該回滾事務(rollback),使該事務中所作的修改所有失效。數據庫
事務回滾有兩種方式:數組
- 顯示回滾:使用rollback。
- 自動回滾:系統錯誤或者強行退出。
事務特性介紹:(ACID) (1)原子性(Atomicity):事務必須是原子工做單元;對於其數據修改,要麼全都執行,要麼全都不執行 (2)一致性(Consistency):事務在完成時,必須使全部的數據都保持一致狀態 (3)隔離性(Isolation):由併發事務所做的修改必須與任何其它併發事務所做的修改隔離 (4)持久性(Durability):事務完成以後,它對於系統的影響是永久性的 事務是數據庫的概念,JDBC支持事務,本質仍是在數據庫中實現的。併發
JDBC中和事務相關API:app
- Connection.getAutoCommit() :得到當前事務的提交方式,默認爲true
- Connection.setAutoCommit():設置事務的提交屬性,參數是true:自動提交;false:不自動提交
- Connection.commit():提交事務
- Connection.rollback():回滾事務
JDBC處理事務模式: (1)先將事務的自動提交關閉; (2)執行事務中的若干SQL語句; (3)事務提交;SQL失敗則回滾; (4)恢復JDBC的事務提交狀態;釋放資源。dom
事務隔離級別:工具
事務的併發讀問題:性能
- 髒讀:讀取到另外一個事務未提交更新數據,即讀取到了髒數據;
- 不可重複讀:對同一記錄的兩次讀取不一致,由於另外一事物對該記錄作了修改;
- 幻讀(虛讀):對同一張表的兩次查詢不一致,由於零壹拾伍插入了一條記錄;
四大隔離級別:
四個等級的事務隔離級別,在相同數據環境下,使用相同的輸入,執行相同的工具,根據不一樣的隔離級別,能夠致使不一樣的結果。不一樣事務隔離級別可以解決的數據併發問題的能力是不一樣的。
-
SERIAUZABLE(串行化):不會出現任何併發性問題,由於它是對同一數據的訪問是串行的,非併發訪問的。 性能最差
-
REPEATABLEREAD(可重複讀):防止髒讀和不可重複讀,不能處理幻讀問題。性能比SERIAUZABLE好
-
READCOMMITTED(讀已提交數據):防止髒讀,沒有處理不可重複讀,也沒有處理幻讀。性能比REPEATABLEREAD。
-
READUNCOMMITTED(讀未提交數據):可能出現任何事物併發問題,性能最好;
2,批量更新
批量更新主要方法:
- PreparedStatement.addBatch():將多條預編譯的SQL語句,添加到語句列表中。
- PreparedStatement.executeBatch():把語句列表中的全部SQL語句,發送給數據庫處理。
- PreparedStatement.clearBatch():清空當前SQL語句列表。
批量添加:
public int[] insBatch() { Connection connection = null; Statement statement = null; String sql = ""; try { //獲取數據鏈接 connection = basicUse.getConnection(); //獲取發送sql指令執行sql對象 statement = connection.createStatement(); for (int i = 0; i < 10; i++) { StringBuffer sbf = new StringBuffer("insert into student (name, age, addr, hobby) "); sbf.append(" values ('kenx',24,'上海','籃球')"); sql = sbf.toString(); System.out.println("執行sql" + sql); //將指定SQL添加到Statement對象的當前命令列表中 statement.addBatch(sql); } //執行成功返回更新計數的數組 int[] success = statement.executeBatch(); //批量執行全部sql返回一個更新計數的數組 return success; } catch (Exception e) { e.printStackTrace(); return null; } finally { //執行完數據庫操做後記得關閉數據庫鏈接資源 try { statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
批量更新:
public int[] updBatch() { Connection connection = null; Statement statement = null; String sql = ""; try { //獲取數據鏈接 connection = basicUse.getConnection(); //獲取發送sql指令執行sql對象 statement = connection.createStatement(); for (int i = 1; i < 10; i++) { StringBuffer sbf = new StringBuffer("update student set hobby='足球'"); sbf.append(" where id=" + i); sql = sbf.toString(); System.out.println("執行sql" + sql); //將指定SQL添加到Statement對象的當前命令列表中 statement.addBatch(sql); } //執行成功返回更新計數的數組 int[] success = statement.executeBatch(); //批量執行全部sql返回一個更新計數的數組 return success; } catch (Exception e) { e.printStackTrace(); return null; } finally { //執行完數據庫操做後記得關閉數據庫鏈接資源 try { statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
3,返回自動主鍵
JDBC API:
ResultSet java.sql.Statement.getGeneratedKeys() throws SQLException
例:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class Tester { public static void main(String[] args) throws Exception { // 註冊數據庫驅動 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); // 獲取鏈接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "***"); // 準備SQL String sql = "insert into user(name) values('Belin')"; // 準備語句,配置爲自動返回生成主鍵。 PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); // 執行語句 pstmt.executeUpdate(); // 獲取主鍵值,是一個ResultSet。 ResultSet rs = pstmt.getGeneratedKeys(); if (rs.next()) { System.out.println(rs.getInt(1)); } } }
DAO:
什麼是DAO? Data Access Object 數據訪問對象,創建在數據庫和業務層之間,封裝全部對數據庫的訪問。
DAO的做用:將數據訪問邏輯和業務邏輯分開。
DAO一般包括: ①,一個DAO工廠類
②,一個DAO接口
③,一個實現DAO接口的具體類
④,數據傳遞對象(實體對象或值對象)
實體對象:
將java程序中的對象對應到關係數據庫的表中
表和類對應
表中的字段和類的屬性對應
記錄和對象對應
實現的步驟:
- 先創建模型的對象domain;
- 編寫DAO接口;
- 定義DAO實現類;
- 生產DAO測試類;
- 在DAO測試類中測試方法;