Connection 對象簡介 方法解讀 JDBC簡介(四)


通過驅動管理器DriverManager的getConnection方法,可以創建到指定URL的連接
    Connection conn = DriverManager.getConnection(url, user, password);
看得出來, 在JDBC中連接被抽象為Connection
表示:與特定數據庫的連接(會話)
在連接上下文中執行 SQL 語句並返回結果
image_5c46846f_5994

方法梗概

對於應用程序開發者來說,連接Connection主要用於執行對象的獲取從而進一步執行SQL,這是 應用程序與數據庫交互的主要途徑
然后提供了數據庫事務相關信息的設置以及其他信息的設置與獲取
image_5c46846f_4ffd

執行對象

用於將 SQL 語句發送到數據庫中
對象有三種
Statement
* 作用:用於執行不帶參數的簡單 SQL 語句
* 特點: 每次執行 SQL 語句,數據庫都要執行 SQL 語句的編譯,僅執行一次查詢並返回結果的情形建議使用這個,此時效率高於 PreparedStatement 
PreparedStatement
* 作用:用於執行帶 或 不帶參數的預編譯 SQL 語句
* 特點:是 預編譯的, 在執行可變參數的一條 SQL 語句時,比 Statement 的效率高,安全性好,有效防止 SQL 注入等問題,對於多次重復執行的語句,效率會更高
CallableStatement
* 作用:用於執行對數據庫 存儲過程 的調用

事務

Connection提供了對於事務相關操作的支持
事務有自動提交的特性可以設置,自動提交默認每條SQL將會單獨一個事務,Connection提供了自動提交屬性的查詢方法
如果不是自動提交,那么將會延續到手動COMMIT或者ROLLBACK
還能夠設置和獲取事務的隔離性
另外還可以靈活的設置保存點,從而讓一個事務分割成幾部分,可以部分提交

連接屬性

連接本身有一些屬性信息,比如目錄等
其中最重要的就是Connection的關閉,數據庫的連接是有限的,Connection在使用完畢后需要進行關閉
另外還提供了連接狀態的測試方法

小結

Connection最為基礎的方法就是執行對象的創建以及事務相關以及連接屬性相關的 
其他方法屬於對於數據庫本身能力的API支持。

重點方法簡介

執行對象

靜態執行對象創建createStatement
Statement createStatement()
          創建一個 Statement 對象來將 SQL 語句發送到數據庫。
Statement createStatement(int resultSetType, int resultSetConcurrency)
          創建一個 Statement 對象,該對象將生成具有給定類型和並發性的 ResultSet 對象。
Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
          創建一個 Statement 對象,該對象將生成具有給定類型、並發性和可保存性的 ResultSet 對象。
 
createStatement的核心是為了創建Statement,不帶參數的 SQL 語句通常使用 Statement 對象執行;
如果多次執行相同的 SQL 語句,使用 PreparedStatement 對象可能更有效。
三個版本的createStatement核心是一樣的, 區別在於參數的設置,參數的設置是針對於結果集的
空參數的createStatement返回的Statement 對象,創建的結果集在默認情況下類型為 TYPE_FORWARD_ONLY,並帶有 CONCUR_READ_ONLY 並發級別
已創建結果集的可保存性可調用 getHoldability() 確定
 
resultSetType - 以下 ResultSet 常量之一:
ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE
 
resultSetConcurrency - 以下 ResultSet 常量之一:
ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE
 
resultSetHoldability - 以下 ResultSet 常量之一:
ResultSet.HOLD_CURSORS_OVER_COMMIT 或 ResultSet.CLOSE_CURSORS_AT_COMMIT 
簡言之,createStatement系列用於創建Statement--通常用來執行不帶參數的SQL,並且附帶的可以設置結果集的類型、並發性、可保存性
 
動態執行對象創建prepareStatement
PreparedStatement prepareStatement(String sql)
          創建一個 PreparedStatement 對象來將參數化的 SQL 語句發送到數據庫。
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
          創建一個默認 PreparedStatement 對象,該對象能獲取自動生成的鍵。
PreparedStatement prepareStatement(String sql, int[] columnIndexes)
          創建一個能返回由給定數組指定的自動生成鍵的默認 PreparedStatement 對象。
PreparedStatement prepareStatement(String sql, String[] columnNames)
          創建一個能返回由給定數組指定的自動生成鍵的默認 PreparedStatement 對象。 
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
          創建一個 PreparedStatement 對象,該對象將生成具有給定類型和並發性的 ResultSet 對象。
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
          創建一個 PreparedStatement 對象,該對象將生成具有給定類型、並發性和可保存性的 ResultSet 對象。
 
 
prepareStatement系列方法創建一個 PreparedStatement 對象來將參數化的 SQL 語句發送到數據庫。
 
1. prepareStatement(String sql) 最為基礎的創建方法
帶有 IN 參數或不帶有 IN 參數的 SQL 語句都可以被預編譯並存儲在 PreparedStatement 對象中。然后 可以有效地使用此對象來多次執行該語句
結果集屬性在默認情況下類型為 TYPE_FORWARD_ONLY,並帶有 CONCUR_READ_ONLY 並發級別。
已創建結果集的可保存性可調用 getHoldability() 確定。
image_5c46846f_41a9
2. 返回鍵值數據
prepareStatement(String sql, int autoGeneratedKeys)
創建一個默認 PreparedStatement 對象, 該對象能獲取自動生成的鍵
autoGeneratedKeys - 指示是否應該返回自動生成的鍵的標志,它是 Statement.RETURN_GENERATED_KEYS 或 Statement.NO_GENERATED_KEYS 之一
通過設置Statement.RETURN_GENERATED_KEYS要求返回主鍵
通過getGeneratedKeys方法,獲取結果集,進而可以獲取主鍵
此處插入一條記錄,所以主鍵返回必然只有一個,當試圖獲取不存在的下標時,將會拋出異常,如下面所示,讀取rs.getInt(2);時就報錯了
image_5c468470_351b
另外還可以使用int數組指定列下標,或者String數組指定列名,指明用於返回的鍵
prepareStatement(String sql, int[] columnIndexes)
prepareStatement(String sql, String[] columnNames)
注意:
這幾個方法並不是說所有的數據庫都支持都一樣,比如對於MYSQL來說,都是一回事
image_5c468470_6bce
 
通過測試代碼我們也可以看得出來,隨便設置的數組,也都無所謂,因為mysql壓根就沒關注數組的內容(上面的代碼為mysql的實現)
image_5c468470_154d
 
類似createStatement 也有可以設置結果集類型、並發性、可保存性的方法
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
 
resultSetType - 以下 ResultSet 常量之一:
ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE
 
resultSetConcurrency - 以下 ResultSet 常量之一:
ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE
 
resultSetHoldability - 以下 ResultSet 常量之一:
ResultSet.HOLD_CURSORS_OVER_COMMIT 或 ResultSet.CLOSE_CURSORS_AT_COMMIT 
 
默認情況下類型為 TYPE_FORWARD_ONLY,並帶有 CONCUR_READ_ONLY 並發級別。
已創建結果集的可保存性可調用 getHoldability() 確定。
這一點還是那樣子,如果沒設置的,存在默認值
 
存儲過程執行對象創建CallableStatement
CallableStatement prepareCall(String sql)
          創建一個 CallableStatement 對象來調用數據庫存儲過程。
 
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency)
          創建一個 CallableStatement 對象,該對象將生成具有給定類型和並發性的 ResultSet 對象。
 
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
          創建一個 CallableStatement 對象,該對象將生成具有給定類型和並發性的 ResultSet 對象。 
 
核心為創建存儲過程的執行對象,另外與createStatement和prepareStatement方法類似,可以設置結果集的類型、並發性、可保存性。

事務

支持事務的數據庫一般都有自動提交,提交、回滾、保存點、事務隔離級別這幾個基本屬性。
Connection中提供了對他們的支持。
 
boolean getAutoCommit()
          獲取此 Connection 對象的當前自動提交模式。 
 
void commit()
          使所有上一次提交/回滾后進行的更改成為持久更改,並釋放此 Connection 對象當前持有的所有數據庫鎖。
 
void rollback()
          取消在當前事務中進行的所有更改,並釋放此 Connection 對象當前持有的所有數據庫鎖。
 
void rollback(Savepoint savepoint)
          取消所有設置給定 Savepoint 對象之后進行的更改。
 
void setAutoCommit(boolean autoCommit)
          將此連接的自動提交模式設置為給定狀態。          
 
void setTransactionIsolation(int level)
          試圖將此 Connection 對象的事務隔離級別更改為給定的級別。
 
int getTransactionIsolation()
          獲取此 Connection 對象的當前事務隔離級別。
 
Savepoint setSavepoint()
          在當前事務中創建一個未命名的保存點 (savepoint),並返回表示它的新 Savepoint 對象。
 
Savepoint setSavepoint(String name)
          在當前事務中創建一個具有給定名稱的保存點,並返回表示它的新 Savepoint 對象。  
 
void releaseSavepoint(Savepoint savepoint)
          從當前事務中移除指定的 Savepoint 和后續 Savepoint 對象。
 

連接自身屬性狀態

Connection最重要的一個狀態就是打開與關閉,通過getConnection方法如果連接成功,那么該連接被打開
在使用結束之后你需要手動進行關閉
void close()
          立即釋放此 Connection 對象的數據庫和 JDBC 資源,而不是等待它們被自動釋放。
JDBC還提供了查詢方法用於檢測該連接是否已經被關閉。
boolean isClosed()
          查詢此 Connection 對象是否已經被關閉。
 
另外還有檢測連接是否有效的方法
boolean isValid(int timeout)
          如果連接尚未關閉並且仍然有效,則返回 true。   

總結

Connection主要用於創建SQL的執行對象,而連接通過驅動管理器DriverManager的getConnection方法進行獲取。
Connection並不是所有的方法都如API描述的一模一樣,要看具體的驅動程序的支持情況
比如前面提到的MYSQL對於prepareStatement(String sql, String[] columnNames)和prepareStatement(String sql, int[] columnIndexes)的情況
通過連接對執行對象的創建,決定了很多事情
比如執行語句的特質,是用來執行靜態SQL還是預編譯帶參數的動態的SQL還是存儲過程?
也可以對結果集的參數進行設置
事務的相關處理也是在連接中操作的。
通過連接還能夠獲得數據庫的元數據信息
我們所有的查詢都是在一個數據庫連接中進行的,所以此次操作所需要的東西,比如sql設置、結果集屬性設置再或者數據庫相關的元數據信息等都可以通過Connection獲得。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM