JDBC學習

jopen 10年前發布 | 29K 次閱讀 JDBC Java開發

java的持久層,與數據庫打交道,其實最終的底層實現都是通過JDBC相關的接口和類來完成。

JDBC,主要涉及以下一些主要的接口和類:

1、java.sql.DriverManager:管理一組JDBC驅動程序的基本服務。該類包以下幾個主要的方法:
1)registerDriver(java.sql.Driver driver):向DriverManager注冊給定的驅動程序。
通常,每個數據庫驅動程序類,都會在靜態的代碼模塊中,調用DriverManager.registerDriver,將自己注冊到DriverManager。程序還可以使用這種方式顯式地加載JDBC驅動程序:Class.forName("my.sql.Driver");
2)getDriver(String url):根據connectionUrl,從已注冊的驅動程序集中,查找能理解給定connectionUrl的驅動程序。每個驅動程序,都會實現Driver接口的acceptsURL方法,該方法用來判斷該驅動程序能否理解這種connectionUrl。
3)getDrivers():獲取當前已加載的所有JDBC驅動程序。
4)getConnection():DriverManager試圖從已注冊的驅動程序中,選擇一個適當的驅動程序,然后建立到給定數據庫URL的連接。
Connection con = DriverManager.getConnection(url, username, password);

2、java.sql.Driver:每個驅動程序類必須實現的接口。
每個驅動程序都應該提供一個實現Driver接口的類。在加載某一Driver類時,它應該創建自己的實例,并向DriverManager注冊該實例。這意味著用戶可以通過調用以下程序加載和注冊一個驅動程序:
Class.forName("foo.bah.Driver")
Driver兩個主要的方法:
1)Connection connect(String url, java.util.Properties info)
2)boolean acceptsURL(String url)

3、java.sql.Connection:與特定數據庫的連接會話,在連接上下文中執行SQL語句并返回結果。
默認情況下,Connection對象處于自動提交模式下,這意味著它在執行每個語句后都會自動提交更改。如果禁用自動提交模式,為了提交更改,必須顯式調用commit方法,否則無法保存數據庫變更。
Connection可以通過DriverManager獲取,也可以通過新的API DataSource獲取。

4、java.sql.Statement:用于執行靜態SQL語句并返回它所生成結果的對象。
在默認情況下,同一時間,每個Statement對象只能打開一個ResultSet對象
Statement stmt = conn.createStatement();

5、java.sql.PreparedStatement(繼承了Statement):表示預編譯的SQL語句對象。SQL語句被預編譯并且存儲在PreparedStatement對象中,然后可以使用此對象高效地多次執行該語句。
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");

6、java.sql.CallableStatement(繼承了PreparedStatement):用于執行SQL存儲過程的接口。
CallableStatement cstmt = con.prepareCall("xxx");

7、java.sql.ResultSet:表示數據庫結果集的數據表,通常通過執行查詢數據庫的語句生成。
默認的ResultSet對象不可更新,僅有一個向前移動的指針。因此,只能迭代它一次,并且只能按從第一行到最后一行的順序進行。
ResultSet接口提供用于從當前行檢索列值的獲取方法,可以使用列的索引編號或列的名稱檢索值。一般情況下,使用列索引較為高效。列從1開始編號。使用列名稱,不區分大小寫。
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
 
8、java.sql.ResultSetMetaData:可用于獲取關于ResultSet對象中列的類型和屬性信息的對象。
ResultSetMetaData rsmd = rs.getMetaData();

9、java.sql.ParameterMetaData:可用于獲取關于PreparedStatement對象中參數的類型和屬性信息的對象。
ParameterMetaData pmd = pstmt.getParameterMetaData();

10、java.sql.DatabaseMetaData:關于數據庫的整體綜合信息。
DatabaseMetaData dmd = connection.getMetaData();

JDBC 2.0 新增的API
11、javax.sql.DataSource:是JDBC2.0 API中新增的內容,它提供了連接到數據源的另一種方法。作為DriverManager設施的代替項,DataSource對象是獲取連接的首選方法。實現DataSource接口的對象通常基于JNDI API的命名服務中注冊。
通過DataSource對象訪問的驅動程序不會向DriverManager注冊。
Connection con = dataSource.getConnection();

12、javax.sql.PooledConnection:為連接池管理提供掛鉤的對象。PooledConnection對象表示到數據源的物理連接(Connection表示邏輯連接)。該連接在應用程序使用完后可以回收而不用關閉,從而減少了需要建立連接的次數。
應用程序員不直接使用PooledConnection接口,而是使用Connection接口。當應用程序關閉連接時,它調用Connection.close()方法關閉邏輯連接,而基礎物理連接會被回收而不是被關閉。在連接池管理器調用PooledConnection.close()方法之前,物理連接不會被關閉。

13、javax.sql.ConnectionPoolDataSource:PooledConnection對象的工廠。實現此接口的對象通常在JNDI的命名服務中注冊。

 

程序訪問數據庫,也存在編碼的問題

Oracle通常使用的字符集是ISO-8859-1,而程序使用的字符集是GBK(或UTF-8),因此為了解決編碼不一致導致亂碼的問題,通常會在數據庫驅動程序中提供編碼和解碼的功能。(當然,如果數據庫和程序使用的字符集是一致的,則不需要進行編碼解碼)

舉例:客戶端程序使用GBK字符集,而Oracle使用ISO-8859-1字符集。

1)往數據庫插入數據前,先對要插入的字符串數據進行編碼:

String res = new String(str.getBytes("GBK"), "ISO-8859-1");

2)從數據庫查詢數據后,需要對查詢結果的字符串數據進行解碼:

String res = new String(str.getBytes("ISO-8859-1"), "GBK");


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!