關於jdbc的學習

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的連接。
[java] view plain copy
  1. Connection con = DriverManager.getConnection(url, username, password);  

2、java.sql.Driver:每個驅動程序類必須實現的接口。
每個驅動程序都應該提供一個實現Driver接口的類。在加載某一Driver類時,它應該創建自己的實例,並向DriverManager註冊該實例。這意味着用戶可以通過調用以下程序加載和註冊一個驅動程序:
[java] view plain copy
  1. 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對象
[java] view plain copy
  1. Statement stmt = conn.createStatement();  

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

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

7、java.sql.ResultSet:表示數據庫結果集的數據表,通常通過執行查詢數據庫的語句生成。
默認的ResultSet對象不可更新,僅有一個向前移動的指針。因此,只能迭代它一次,並且只能按從第一行到最後一行的順序進行。
ResultSet接口提供用於從當前行檢索列值的獲取方法,可以使用列的索引編號或列的名稱檢索值。一般情況下,使用列索引較爲高效。列從1開始編號。使用列名稱,不區分大小寫。
[java] view plain copy
  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對象中參數的類型和屬性信息的對象。
[java] view plain copy
  1. ParameterMetaData pmd = pstmt.getParameterMetaData();  

10、java.sql.DatabaseMetaData:關於數據庫的整體綜合信息。
[java] view plain copy
  1. DatabaseMetaData dmd = connection.getMetaData();  

JDBC 2.0 新增的API
11、javax.sql.DataSource:是JDBC2.0 API中新增的內容,它提供了連接到數據源的另一種方法。作爲DriverManager設施的代替項,DataSource對象是獲取連接的首選方法。實現DataSource接口的對象通常基於JNDI API的命名服務中註冊。
通過DataSource對象訪問的驅動程序不會向DriverManager註冊。
[java] view plain copy
  1. 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)往數據庫插入數據前,先對要插入的字符串數據進行編碼:

[java] view plain copy
  1. String res = new String(str.getBytes("GBK"), "ISO-8859-1");  

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

[java] view plain copy
  1. String res = new String(str.getBytes("ISO-8859-1"), "GBK");  



圖1.



圖2.




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章