答疑解惑:什么是JDBC?
JDBC為工具/數據庫開發人員提供了一個標準的API,據此可以構建更高級的工具和接口,使數據庫開發人員能夠用純 Java API 編寫數據庫應用程序,同時,JDBC也是個商標名。
有了JDBC,向各種關系數據發送SQL語句就是一件很容易的事。換言之,有了JDBC API,就不必為訪問Sybase數據庫專門寫一個程序,為訪問Oracle數據庫又專門寫一個程序,或為訪問Informix數據庫又編寫另一個程序等等,程序員只需用JDBC API寫一個程序就夠了,它可向相應數據庫發送SQL調用。同時,將Java語言和JDBC結合起來使程序員不必為不同的平臺編寫不同的應用程序,只須寫一遍程序就可以讓它在任何平臺上運行,這也是Java語言“編寫一次,處處運行”的優勢。
Java數據庫連接體系結構是用于Java應用程序連接數據庫的標準方法。JDBC對Java程序員而言是API,對實現與數據庫連接的服務提供商而言是接口模型。作為API,JDBC為程序開發提供標準的接口,并為數據庫廠商及第三方中間件廠商實現與數據庫的連接提供了標準方法。JDBC使用已有的SQL標準并支持與其它數據庫連接標準,如ODBC之間的橋接。JDBC實現了所有這些面向標準的目標并且具有簡單、嚴格類型定義且高性能實現的接口。
Java 具有堅固、安全、易于使用、易于理解和可從網絡上自動下載等特性,是編寫數據庫應用程序的杰出語言。所需要的只是 Java應用程序與各種不同數據庫之間進行對話的方法。而 JDBC 正是作為此種用途的機制。
JDBC 擴展了 Java 的功能。例如,用 Java 和 JDBC API 可以發布含有 applet 的網頁,而該 applet 使用的信息可能來自遠程數據庫。企業也可以用 JDBC 通過 Intranet 將所有職員連到一個或多個內部數據庫中(即使這些職員所用的計算機有 Windows、 Macintosh 和UNIX 等各種不同的操作系統)。隨著越來越多的程序員開始使用Java 編程語言,對從 Java 中便捷地訪問數據庫的要求也在日益增加。
MIS 管理員們都喜歡 Java 和 JDBC 的結合,因為它使信息傳播變得容易和經濟。企業可繼續使用它們安裝好的數據庫,并能便捷地存取信息,即使這些信息是儲存在不同數據庫管理系統上。新程序的開發期很短。安裝和版本控制將大為簡化。程序員可只編寫一遍應用程序或只更新一次,然后將它放到服務器上,隨后任何人就都可得到最新版本的應用程序。對于商務上的銷售信息服務, Java 和JDBC 可為外部客戶提供獲取信息更新的更好方法。
JDBC 的用途
簡單地說,JDBC 可做三件事:與數據庫建立連接、發送 SQL 語句并處理結果。下列代碼段給出了以上三步的基本示例:
- Connection con = DriverManager.getConnection("jdbc:odbc:wombat","login",
- "password");
- Statement stmt = con.createStatement();
- ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
- while (rs.next()) {
- int x = rs.getInt("a");
- String s = rs.getString("b");
- float f = rs.getFloat("c");
- }
上述代碼對基于JDBC的數據庫訪問做了經典的總結,當然,在本小節的后續部分會對它做詳盡的分析講解。
什么是JDBC API?
JDBC 是個"低級"接口,也就是說,它用于直接調用 SQL 命令。在這方面它的功能極佳,并比其它的數據庫連接 API 易于使用,但它同時也被設計為一種基礎接口,在它之上可以建立高級接口和工具。高級接口是"對用戶友好的"接口,它使用的是一種更易理解和更為方便的 API,這種API在幕后被轉換為諸如 JDBC 這樣的低級接口。
在關系數據庫的"對象/關系"映射中,表中的每行對應于類的一個實例,而每列的值對應于該實例的一個屬性。于是,程序員可直接對 Java 對象進行操作;存取數據所需的 SQL 調用將在"掩蓋下"自動生成。此外還可提供更復雜的映射,例如將多個表中的行結合進一個 Java 類中。
隨著人們對 JDBC 的興趣日益增漲,越來越多的開發人員一直在使用基于 JDBC 的工具,以使程序的編寫更加容易。程序員也一直在編寫力圖使最終用戶對數據庫的訪問變得更為簡單的應用程序。例如應用程序可提供一個選擇數據庫任務的菜單。任務被選定后,應用程序將給出提示及空白供填寫執行選定任務所需的信息。所需信息輸入應用程序將自動調用所需的 SQL 命令。在這樣一種程序的協助下,即使用戶根本不懂 SQL 的語法,也可以執行數據庫任務。
JDBC與ODBC和其它API的比較
目前,Microsoft 的 ODBC API 可能是使用最廣的、用于訪問關系數據庫的編程接口。它能在幾乎所有平臺上連接幾乎所有的數據庫。為什么 Java 不使用 ODBC?對這個問題的回答是:Java 可以使用 ODBC,但最好是在 JDBC 的幫助下以 JDBC-ODBC 橋的形式使用,這一點我們稍后再說?,F在的問題已變成:"為什么需要 JDBC"?答案是顯然的:ODBC 不適合直接在 Java 中使用,因為它使用 C 語言接口。從Java 調用本地 C 代碼在安全性、實現、堅固性和程序的自動移植性方面都有許多缺點。從 ODBC C API 到 Java API 的字面翻譯是不可取的。例如,Java 沒有指針,而 ODBC 卻對指針用得很廣泛(包括很容易出錯的指針"void *")。您可以將 JDBC 想象成被轉換為面向對象接口的 ODBC,而面向對象的接口對 Java 程序員來說較易于接收。
ODBC 很難學。它把簡單和高級功能混在一起,而且即使對于簡單的查詢,其選項也極為復雜。相反,JDBC 盡量保證簡單功能的簡便性,而同時在必要時允許使用高級功能。啟用"純 Java "機制需要象 JDBC 這樣的 Java API。如果使用ODBC,就必須手動地將 ODBC 驅動程序管理器和驅動程序安裝在每臺客戶機上。如果完全用 Java 編寫 JDBC 驅動程序則 JDBC 代碼在所有 Java 平臺上(從網絡計算機到大型機)都可以自 動安裝、移植并保證安全性。
總之,JDBC API 對于基本的 SQL 抽象和概念是一種自然的 Java 接口。它建立在 ODBC 上而不是從零開始。因此,熟悉 ODBC 的程序員將發現 JDBC 很容易使用。JDBC 保留了 ODBC 的基本設計特征;事實上,兩種接口都基于 X/Open SQL CLI(調用級接口)。它們之間最大的區別在于:JDBC 以 Java 風格與優點為基礎并進行優化,因此更加易于使用。
目前,Microsoft 又引進了 ODBC 之外的新 API: RDO、 ADO 和OLE DB。這些設計在許多方面與 JDBC 是相同的,即它們都是面向對象的數據庫接口且基于可在 ODBC 上實現的類。但在這些接口中,我們未看見有特別的功能使我們要轉而選擇它們來替代 ODBC,尤其是在 ODBC 驅動程序已建立起較為完善的市場的情況下。它們最多也就是在 ODBC 上加了一種裝飾而已。
JDBC URL 參數詳解
JDBC URL提供了一種標識數據庫的方法,可以使相應的驅動程序能識別該數據庫并與之建立連接。實際上,驅動程序編程員將決定用什么JDBC URL來標識特定的驅動程序。用戶不必關心如何來形成JDBC URL;他們只須使用與所用的驅動程序一起提供的URL即可。JDBC的作用是提供某些約定,驅動程序編程員在構造他們的JDBC URL時應該遵循這些約定。
由于JDBC URL要與各種不同的驅動程序一起使用,因此這些約定應非常靈活。首先,它們應允許不同的驅動程序使用不同的方案來命名數據庫。例如,odbc子協議允許(但并不是要求)URL含有屬性值。
其次,JDBC URL應允許驅動程序編程員將一切所需的信息編入其中。這樣就可以讓要與給定數據庫對話的applet打開數據庫連接,而無須要求用戶去做任何系統管理工作。
最后,JDBC URL應允許某種程度的間接性。也就是說,JDBC URL可指向邏輯主機或數據庫名,而這種邏輯主機或數據庫名將由網絡命名系統動態地轉換為實際的名稱。這可以使系統管理員不必將特定主機聲明為JDBC名稱的一部份。網絡命名服務(例如DNS、NIS和DCE)有多種,而對于使用哪種命名服務并無限制。
JDBC URL的標準語法如下所示。它由三部分組成,各部分間用冒號分隔:
jdbc:<子協議> <子名稱>JDBC URL的三個部分可分解如下:
(1)jdbc協議:JDBC URL中的協議總是jdbc。
(2)<子協議>:驅動程序名或數據庫連接機制(這種機制可由一個或多個驅動程序支持)的名稱。子協議名的典型示例是"odbc",該名稱是為用于指定ODBC風格的數據資源名稱的URL專門保留的。例如,為了通過JDBC-ODBC橋來訪問某個數據庫,可以用如下所示的URL:jdbc:odbc:book。本例中,子協議為"odbc",子名稱"book"是本地ODBC數據資源。如果要用網絡命名服務(這樣JDBC URL中的數據庫名稱不必是實際名稱),則命名服務可以作為子協議。例如,可用如下所示的URL:jdbc:dcenaming:accounts。本例中,該URL指定了本地DCE命名服務應該將數據庫名稱"accounts"解析為更為具體的可用于連接真實數據庫的名稱。
(3)<子名稱>:種標識數據庫的方法。子名稱可以依不同的子協議而變化。它還可以有子名稱的子名稱(含有驅動程序編程員所選的任何內部語法)。使用子名稱的目的是為定位數據庫提供足夠的信息。前例中,因為ODBC將提供其余部份的信息,因此用"book"就已足夠。然而,位于遠程服務器上的數據庫需要更多的信息。例如,如果數據庫是通過Internet來訪問的,則在JDBC URL中應將網絡地址作為子名稱的一部份包括進去,且必須遵循如下所示的標準URL命名約定://主機名:端口/子協議。
假設"dbnet"是個用于將某個主機連接到Internet上的協議,則JDBC URL應為:jdbc:dbnet://wombat:356/fred。
答疑解惑:什么是JDBC?到此結束
【編輯推薦】