經過驅動管理器DriverManager的getConnection方法,能夠建立到指定URL的鏈接
Connection conn = DriverManager.getConnection(url, user, password);
看得出來,
在JDBC中鏈接被抽象爲Connection
表示:與特定數據庫的鏈接(會話)
在鏈接上下文中執行 SQL 語句並返回結果
方法梗概
對於應用程序開發者來講,鏈接Connection主要用於執行對象的獲取從而進一步執行SQL,這是
應用程序與數據庫交互的主要途徑
而後提供了數據庫事務相關信息的設置以及其餘信息的設置與獲取
執行對象
用於將 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() 肯定。
2. 返回鍵值數據
prepareStatement(String sql, int autoGeneratedKeys)
建立一個默認 PreparedStatement 對象,
該對象能獲取自動生成的鍵
autoGeneratedKeys - 指示是否應該返回自動生成的鍵的標誌,它是 Statement.RETURN_GENERATED_KEYS 或 Statement.NO_GENERATED_KEYS 之一
經過設置Statement.RETURN_GENERATED_KEYS要求返回主鍵
經過getGeneratedKeys方法,獲取結果集,進而能夠獲取主鍵
此處插入一條記錄,因此主鍵返回必然只有一個,當試圖獲取不存在的下標時,將會拋出異常,以下面所示,讀取rs.getInt(2);時就報錯了
另外還可使用int數組指定列下標,或者String數組指定列名,指明用於返回的鍵
prepareStatement(String sql, int[] columnIndexes)
prepareStatement(String sql, String[] columnNames)
注意:
這幾個方法並非說全部的數據庫都支持都同樣,好比對於MYSQL來講,都是一回事
經過測試代碼咱們也能夠看得出來,隨便設置的數組,也都無所謂,由於mysql壓根就沒關注數組的內容(上面的代碼爲mysql的實現)
相似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得到。