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