軟體項目實訓及課程設計指導——如何正確地應用JDBC API設計和實現應用系統持久層中的各個DAO組件
1、Java 系統平臺中實現資料庫連接技術相關的API
Java 資料庫連接技術(JDBC,Java DataBase Connectivity)是一種將Java語言與SQL語句相互結合且獨立於特定的物理資料庫系統的應用程式編程接口(API,Application Programming Interface)。
JDBC其實也是一種可用於執行SQL語句的Java API規範,它為物理資料庫系統的應用開發人員、資料庫系統的前臺工具開發人員提供了一種標準的應用程式設計接口,使開發人員可以用純Java語言編寫完整的資料庫應用程式。如下示圖為體現JDBC如何幫助Java程序操作訪問物理資料庫系統中相關數據的工作原理示例圖。
從早期的JDBC1.0到現在的JDBC4.0技術標準,JDBC所提供的各種功能也在不斷地豐富和完善中。在JDBC4.0中新增自動加載JDBC驅動程序類的功能,對資料庫連接管理也有所增強、並支持RowId SQL 類型和完善了SQL異常處理等。
如下示圖說明JDBC不僅為Java應用程式提供操作訪問物理資料庫系統的接口,也為資料庫系統的前臺工具開發人員提供了一種標準的應用程式設計接口,為此MyEclipse開發工具也可以應用JDBC輔助Java開發人員操作訪問物理資料庫系統中的目標數據。
2、了解和熟悉JDBC API中主要的功能類
Java程式設計師可以應用JDBC API實現與目標資料庫的連接,然後再向目標資料庫系統發送SQL語句,最後根據特定的數據訪問操作的要求獲得處理後的結果數據——也就是連接資料庫系統、操作目標數據和獲得最終的操作結果。
而完成這三個階段所涉及的功能,主要是通過對Connection 、Statement、PreparedStatement、CallableStatement和ResultSet等接口的應用編程而實現。
讀者可以查詢JDK API的幫助文檔獲得這些類和接口中的方法定義的細節,下圖所示為JDK API的幫助文檔中有關java.sql包的局部內容的截圖。
3 JDBC中所提供的創建資料庫連接的各種實現方式
(1)利用JDBC-ODBC橋方式連接資料庫
JDBC-ODBC 橋接方式是利用微軟的開放資料庫互連接口(ODBC API)同目標資料庫伺服器通訊連接,客戶端計算機首先應該安裝並配置ODBC Driver和JDBC-ODBC 橋兩種形式的驅動程序。並且還需要在Window作業系統的控制面板中配置出目標資料庫的數據源名稱。下圖所示為對某個資料庫的數據源名進行配置的示圖。
由於ODBC-JDBC橋方式的底層實現不是多線程的,也就是說它不適合在需要並發執行的企業級軟體應用系統的開發中使用;同時它也使得軟體應用系統局限於Windows作業系統平臺中運行,而使得軟體應用系統失除了基於Java平臺所具有的平臺無關性。
(2)利用某個資料庫系統的JDBC 驅動程序直接連接方式
這只需要下載獲得某個資料庫的JDBC 驅動程序JAR包文件,並將該JAR包文件放在項目的classpath路徑中。然後由JDBC 驅動程序JAR包文件中的資料庫連接實現類完成對目標資料庫的連接。下圖所示表示將MySQL的JDBC 驅動程序JAR包文件添加到銀行帳戶管理系統中的WEB-INF/classes目錄中的圖示。
(3)基於DataSource接口實現的資料庫連接池方式
由於JDBC的直接連接方式要求每一次數據訪問請求都必須出現建立資料庫連接和操作完畢後再關閉資料庫連接,而資料庫連接的打開和關閉是一件既消耗資源又費時的工作,如果頻繁發生(這在Web應用系統中比較常見),應用系統的總體性能必然會急劇下降,甚至會導致系統崩潰。
在JDBC2.0版中新增加了javax.sql 程序包,它是對標準的JDBC API的功能擴展,其中提供有DataSource接口,基於DataSource接口可以實現資料庫連接池。如下示圖為JDK API的幫助文檔中有關DataSource接口定義和主要功能說明的局部截圖。
而資料庫連接池技術實現方案是解決這個問題最常用的方法——因為資料庫連接池技術是在伺服器啟動時,預先就建立好指定數量的資料庫連接對象;而對於一個資料庫訪問請求,直接從連接池(也就是內存)中得到一個連接並完成對資料庫中的數據的訪問操作,操作完畢後再將資料庫連接對象重新放回到連接池中(此時並沒有真正地關閉資料庫的物理連接)以便能夠在下次請求時重用。
下圖所示為在銀行帳戶管理系統中應用Apache DBCP組件實現資料庫連接池功能的部分實現代碼的圖示。
4、JDBC編程實現的基本步驟和實現代碼示例
(1)加載連接資料庫的驅動程序(把指定的Java類文件裝載到JVM中)
Class.forName("com.mysql.jdbc.Driver");
(2)創建與數據源(如MySQL資料庫系統)的連接
Connection con=
DriverManager.getConnection("jdbc:mysql://localhost:3306/webbank","root","root");
(3)構建出語句類對象並操作資料庫表中的數據
PreparedStatement pstmt = con.prepareStatement("select count(*) from account");
rs = pstmt.executeQuery();
(4)獲得當前記錄集中的某一條記錄的各個欄位的值
rs.next();
int accountTotalCounter = rs.getInt(1);
(5)關閉查詢語句及資料庫連接對象
try {
con.close();
}
catch(SQLException e){
}
如下示圖所示的程序代碼是將上述五個基本步驟組合在一起後的程序代碼示例。
5、應用JDBC API實現軟體應用系統的持久層時所存在的主要問題
對於一個相對簡單的J2EE應用系統的持久層組件,完全可以直接通過JDBC API編程實現對物理資料庫系統中的資料庫表內數據的訪問和操作——應用JDBC API可以說是訪問物理資料庫系統最原始、最直接的方法。
該方式一方面給軟體應用系統的開發人員提供了比較靈活的編程實現手段,但另一方面也增加了軟體應用系統的開發人員的技術實現的複雜性。
下圖所示為銀行帳戶信息管理系統中的帳戶信息DAO組件中的轉帳方法transferAccount的代碼實現片段圖示。
在基於J2EE系統平臺下的軟體應用系統開發實現中應用JDBC API的主要問題表現在每個數據訪問方法中都需要冗長的錯誤處理代碼來確保ResultSets、Statements以及最重要的Connections等對象在使用後能夠正確地被關閉,同時JDBC API也不提供對異常的層次劃分——各個方法全部都拋出SQLException異常。
而對象/關係的映射(Object/Relation Mapping,簡稱ORM)技術是目前企業級系統開發中持久層比較主流的實現技術,並藉助於各種支持ORM技術的框架進一步簡化對資料庫表中數據的訪問操作組件的編程實現。