簡介
有了JDBC,向各種關系數據發送SQL語句就是一件很容易的事。換言之,有了JDBCAPI,就不必為訪問Sybase數據庫專門寫一個程序,為訪問Oracle數據庫又專門寫一個程序,或為訪問Informix數據庫又編寫另一個程序等等,程序員隻需用JDBCAPI寫一個程序就夠了,它可向相應數據庫發送SQL調用,将Java語言和JDBC結合起來使程序員隻須寫一遍程序就可以讓它在任何平台上運行。
Java數據庫連接體系結構是用于Java應用程序連接數據庫的标準方法。JDBC對Java程序員而言是API,對實現與數據庫連接的服務提供商而言是接口模型。作為API,JDBC為程序開發提供标準的接口,并為數據庫廠商及第三方中間件廠商實現與數據庫的連接提供了标準方法。JDBC使用已有的SQL标準并支持與其它數據庫連接标準,如ODBC之間的橋接。JDBC實現了所有這些面向标準的目标并且具有簡單、嚴格類型定義且高性能實現的接口。
JDBCTM是一種用于執行SQL語句的JavaTMAPI,它由一組用Java編程語言編寫的類和接口組成。JDBC為工具/數據庫開發人員提供了一個标準的API,使他們能夠用純JavaAPI來編寫數據庫應用程序。
有了JDBC,向各種關系數據庫發送SQL語句就是一件很容易的事。換言之,有了JDBCAPI,就不必為訪問Sybase數據庫專門寫一個程序,為訪問Oracle數據庫又專門寫一個程序,為訪問Informix數據庫又寫另一個程序,等等。您隻需用JDBCAPI寫一個程序就夠了它可向相應數據庫發送SQL語句。而且,使用Java編程語言編寫的應用程序,就無須去憂慮要為不同的平台編寫不同的應用程序。将Java和JDBC結合起來将使程序員隻須寫一遍程序就可讓它在任何平台上運行。
Java具有堅固、安全、易于使用、易于理解和可從網絡上自動下載等特性,是編寫數據庫應用程序的傑出語言。所需要的隻是Java應用程序與各種不同數據庫之間進行對話的方法。而JDBC正是作為此種用途的機制。
JDBC擴展了Java的功能。例如,用Java和JDBCAPI可以發布含有applet的網頁,而該applet使用的信息可能來自遠程數據庫企業也可以用JDBC通過Intranet将所有職員連到一個或多個内部數據庫中(即使這些職員所用的計算機有Windows、Macintosh和UNIX等各種不同的操作系統)。随着越來越多的程序員開始使用Java編程語言,對從Java中便捷地訪問數據庫的要求也在日益增加。
MIS管理員們都喜歡Java和JDBC的結合,因為它使信息傳播變得容易和經濟。企業可繼續使用它們安裝好的數據庫,并能便捷地存取信息,即使這些信息是儲存在不同數據庫管理系統上。新程序的開發期很短。安裝和版本控制将大為簡化。程序員可隻編寫一遍應用程序或隻更新一次,然後将它放到服務器上,随後任何人就都可得到最新版本的應用程序。對于商務上的銷售信息服務,Java和JDBC可為外部客戶提供獲取信息更新的更好方法。
API
JDBC是個"低級"接口,也就是說,它用于直接調用SQL命令。在這方面它的功能極佳,并比其它的數據庫連接API易于使用,但它同時也被設計為一種基礎接口,在它之上可以建立高級接口和工具。高級接口是"對用戶友好的"接口,它使用的是一種更易理解和更為方便的API,這種API在幕後被轉換為諸如JDBC這樣的低級接口。
在關系數據庫的"對象/關系"映射中,表中的每行對應于類的一個實例,而每列的值對應于該實例的一個屬性。于是,程序員可直接對Java對象進行操作;存取數據所需的SQL調用将在"掩蓋下"自動生成。此外還可提供更複雜的映射,例如将多個表中的行結合進一個Java類中。
随着人們對JDBC的興趣日益增漲,越來越多的開發人員一直在使用基于JDBC的工具,以使程序的編寫更加容易。程序員也一直在編寫力圖使最終用戶對數據庫的訪問變得更為簡單的應用程序。例如應用程序可提供一個選擇數據庫任務的菜單。任務被選定後,應用程序将給出提示及空白供填寫執行選定任務所需的信息。所需信息輸入應用程序将自動調用所需的SQL命令。在這樣一種程序的協助下,即使用戶根本不懂SQL的語法,也可以執行數據庫任務。
比較
ODBC很難學。它把簡單和高級功能混在一起,而且即使對于簡單的查詢,其選項也極為複雜。相反,JDBC盡量保證簡單功能的簡便性,而同時在必要時允許使用高級功能。啟用"純Java"機制需要象JDBC這樣的JavaAPI。如果使用ODBC,就必須手動地将ODBC驅動程序管理器和驅動程序安裝在每台客戶機上。如果完全用Java編寫JDBC驅動程序則JDBC代碼在所有Java平台上(從網絡計算機到大型機)都可以自動安裝、移植并保證安全性。
總之,JDBCAPI對于基本的SQL抽象和概念是一種自然的Java接口。它建立在ODBC上而不是從零開始。因此,熟悉ODBC的程序員将發現JDBC很容易使用。JDBC保留了ODBC的基本設計特征;事實上,兩種接口都基于X/OpenSQLCLI(調用級接口)。它們之間最大的區别在于:JDBC以Java風格與優點為基礎并進行優化,因此更加易于使用。
目前,Microsoft又引進了ODBC之外的新API:RDO、ADO和OLEDB。這些設計在許多方面與JDBC是相同的,即它們都是面向對象的數據庫接口且基于可在ODBC上實現的類。但在這些接口中,我們未看見有特别的功能使我們要轉而選擇它們來替代ODBC,尤其是在ODBC驅動程序已建立起較為完善的市場的情況下。它們最多也就是在ODBC上加了一種裝飾而已。
支持
JDBCAPI既支持數據庫訪問的兩層模型(C/S),同時也支持三層模型(B/S)。在兩層模型中,Javaapplet或應用程序将直接與數據庫進行對話。這将需要一個JDBC驅動程序來與所訪問的特定數據庫管理系統進行通訊。用戶的SQL語句被送往數據庫中,而其結果将被送回給用戶。數據庫可以位于另一台計算機上,用戶通過網絡連接到上面。這就叫做客戶機/服務器配置,其中用戶的計算機為客戶機,提供數據庫的計算機為服務器。網絡可以是Intranet(它可将公司職員連接起來),也可以是Internet。
在三層模型中,命令先是被發送到服務的"中間層",然後由它将SQL語句發送給數據庫。數據庫對SQL語句進行處理并将結果送回到中間層,中間層再将結果送回給用戶。MIS主管們都發現三層模型很吸引人,因為可用中間層來控制對公司數據的訪問和可作的的更新的種類。中間層的另一個好處是,用戶可以利用易于使用的高級API,而中間層将把它轉換為相應的低級調用。最後,許多情況下三層結構可提供一些性能上的好處。
到目前為止,中間層通常都用C或C++這類語言來編寫,這些語言執行速度較快。然而,随着最優化編譯器(它把Java字節代碼轉換為高效的特定于機器的代碼)的引入,用Java來實現中間層将變得越來越實際。這将是一個很大的進步,它使人們可以充分利用Java的諸多優點(如堅固、多線程和安全等特征)。JDBC對于從Java的中間層來訪問數據庫非常重要。
SQL的一緻性
結構化查詢語言(SQL)是訪問關系數據庫的标準語言。困難之處在于:雖然大多數的DBMS(數據庫管理系統)對其基本功能都使用了标準形式的SQL,但它們卻不符合最近為更高級的功能定義的标準SQL語法或語義。例如,并非所有的數據庫都支持儲存程序或外部連接,那些支持這一功能的數據庫又相互不一緻。人們希望SQL中真正标準的那部份能夠進行擴展以包括越來越多的功能。但同時JDBCAPI又必須支持現有的SQL。
JDBCAPI解決這個問題的一種方法是允許将任何查詢字符串一直傳到所涉及的DBMS驅動程序上。這意味着應用程序可以使用任意多的SQL功能,但它必須冒這樣的風險:有可能在某些DBMS上出錯。事實上,應用程序查詢甚至不一定要是SQL,或者說它可以是個為特定的DBMS設計的SQL的專用派生物(例如,文檔或圖象查詢)。
JDBC處理SQL一緻性問題的第二種方法是提供ODBC風格的轉義子句,這将在後續部分中讨論。轉義語法為幾個常見的SQL分歧提供了一種标準的JDBC語法。例如,對日期文字和已儲存過程的調用都有轉義語法。
對于複雜的應用程序,JDBC用第三種方法來處理SQL的一緻性問題它利用DatabaseMetaData接口來提供關于DBMS的描述性信息,從而使應用程序能适應每個DBMS的要求和功能。
由于JDBCAPI将用作開發高級數據庫訪問工具和API的基礎API,因此它還必須注意其所有上層建築的一緻性。"符合JDBC标準TM"代表用戶可依賴的JDBC功能的标準級别。要使用這一說明,驅動程序至少必須支持ANSISQL-2EntryLevel(ANSISQL-2代表美國國家标準局1992年所采用的标準。EntryLevel代表SQL功能的特定清單)。驅動程序開發人員可用JDBCAPI所帶的測試工具包來确定他們的驅動程序是否符合這些标準。
"符合JDBC标準TM"表示提供者的JDBC實現已經通過了JavaSoft提供的一緻性測試。這些一緻性測試将檢查JDBCAPI中定義的所有類和方法是否都存在,并盡可能地檢查程序是否具有SQLEntryLevel功能。當然,這些測試并不完全,而且JavaSoft目前也無意對各提供者的實現進行标級。但這種一緻性定義的确可對JDBC實現提供一定的可信度。随着越來越多的數據庫提供者、連接提供者、Internet提供者和應用程序編程員對JDBCAPI的接受,JDBC也正迅速成為Java數據庫訪問的标準。
設置表
創建表
首先,我們在我們的示例數據庫創建其中一張表COFFEES,包含在咖啡店所賣咖啡的必要的信息,包括咖啡名字,他們的價格,本星期賣了多少磅及迄今為止賣的數目。
存儲咖啡名的列是COF_NAME,它的SQL數據類型是VARCHAR,最大的長度為32個字符。因為我們所賣的每種類型咖啡都使用不同的名字,名字可用于作為唯一識别咖啡的标識,因此可用于作主鍵。第二個列叫SUP_ID,用于保存咖啡供應商标識;其SQL數據類型為INTEGER。
第3列叫PRICE,因為它需要保存帶小數的十進制數,因此它的SQL類型為FLOAT。(注意,通常錢的SQL類型為DECIMAL或NUMERIC,但在不同DBMSs間存在差異,為了避免于老版本的JDBC的不兼容性在本教程我們采用更标準的FLOAT類型)SALES列的SQL類型為INTEGER,其值為本星期所賣咖啡的磅數。最後一列,TOTAL的SQL類型為INTEGER,保存了迄今為止所賣咖啡的總磅數。
COFFEES跟SUPPLIERS都包含列SUP_ID,它意味着可以用SELECT語句從這兩張表中取得有關信息。列SUP_ID是SUPPLIERS表的主鍵,用于唯一識别每個咖啡供應商。在COFFEES表中,SUP_ID列被稱外鍵。注意每個SUP_ID值在SUPPLIERS表裡隻出現一次;這對主鍵是必須的。在COFFEES表裡,它作為外鍵,顯然它可以有重複的SUP_ID值,因為同一供應商可以提供很多種的咖啡。在本節的最後,你将看見如何在SELECT語句中使用主鍵及外鍵的一個例子。
在CREATETABLE語句中,關鍵字采用大寫字符,并且每個項目都另起一行。SQL并沒有此要求;僅僅是為了更容易閱讀。SQL标準是不區分關鍵詞的大小寫的,因此,如下例中的SELECT語句可以有多種寫法。因此下面兩個不同寫法的語句對SQL來說是一樣的。
執行語句
使用executeUpdate方法是因為在createTableCoffees中的SQL語句是DDL(數據定義語言)語句。創建表,改變表,删除表都是DDL語句的例子,要用executeUpdate方法來執行。你也可以從它的名字裡看出,方法executeUpdate也被用于執行更新表SQL語句。實際上,相對于創建表來說,executeUpdate用于更新表的時間更多,因為表隻需要創建一次,但經常被更新。
被使用最多的執行SQL語句的方法是executeQuery。這個方法被用來執行SELECT語句,它幾乎是使用最多的SQL語句。馬上你将看到如何使用這個方法。
開始
安裝
Java數據庫連接(JDBC)是一個标準SQL(StructuredQueryLanguage,結構化查詢語言)數據庫訪問接口,可以為多種關系數據庫提供統一訪問。JDBC(JavaDataBaseConnection,Java數據庫連接)也提供一種基準,據此可以構建更高級的工具和接口。目前的JDK(JavaDevelopmentKit,Java開發工具包)軟件捆綁包括JDBC和JDBC-ODBC(OpenDataBaseConnection,開放式數據庫連接)橋。這些包也可獨立得到,以跟JDK1.0一起使用。應該注意的是,本文的示例使用了JDBC2.0接口,需要JDK2.0來運行,不能在JDK1.1下運行。
安裝驅動程序
你的驅動程序應該有安裝方法。為特定的DBMSs寫的JDBC驅動程序安裝時隻要拷貝到你的計算機上就可以了。并不需要特殊的配置。
如果你下載的是Solaris或WindowsJDK1.1版本,橋作為包sun.jdbc.odbc與JDK一起自動安裝。有關安裝和配置ODBC的信息,請咨詢ODBC驅動程序廠商。橋無須特殊配置。有關客戶機安裝和配置信息,請咨詢數據庫廠商。
配置數據庫
我們假設數據庫COFFEEBREAK已經存在。(創建一個數據庫并不困難,但需要一定的權限并通常是由數據庫管理員來做)你還需要在此數據庫裡創建本教程作為例子使用的表。我們有意限制表的大小跟及數目,以便于管理。



















