第一章 使用JDBC創建數據庫訪問程序
什麼是數據庫?
數據庫是以某種文件結構存儲的一係列信息表,這種文件結構使您能夠訪問這些表、選擇表中的列、對表進行排序以及根據各種標準選擇行。數據庫通常有多個 索引與這些表中的許多列相關聯,所以我們能盡可能快地訪問這些表。
以員工記錄為例,您可以設想一個含有員工姓名、地址、工資、扣稅以及津貼等內容的表。讓我們考慮一下這些內容可能如何組織在一起。您可以設想一個表包含員工姓名、地址和電話號碼。您希望保存的其它信息可能包括工資、工資範圍、上次加薪時間、下次加薪時間、員工業績評定等內容。
這些內容是否應保存在一個表格中?幾乎可以肯定不應該如此。不同類別的員工的工資範圍可能沒有區別;這樣,您可以僅將員工類型儲存在員工記錄表中,而將工資範圍儲存在另一個表中,通過類型編號與這個表關聯。考慮以下情況:
Key Lastname SalaryType SalaryType Min Max
1 Adams 2 1 30000 45000
2 Johnson 1 2 45000 60000
3 Smyth 3 3 60000 75000
4 Tully 1
5 Wolff 2
SalaryType 列中的數據引用第二個表。我們可以想象出許多種這樣的表,如用於存儲居住城市和每個城市的稅值、健康計劃扣除金額等的表。每個表都有一個主鍵列(如上麵兩個表中最左邊的列)和若幹數據列。在數據庫中建立表格既是一門藝術,也是一門科學。這些表的結構由它們的範式指出。我們通常說表屬於1NF、2NF 或 3NF。
第一範式:表中的每個表元應該隻有一個值(永遠不可能是一個數組)。(1NF)
第二範式:滿足 1NF,並且每一個非主鍵列完全依賴於主鍵列。這表示主鍵和該行中的剩餘表元之間是 1 對 1 的關係。(2NF)
第三範式:滿足 2NF,並且所有非主鍵列是互相獨立的。任何一個數據列中包含的值都不能從其他列的數據計算得到。(3NF)
現在,幾乎所有的數據庫都是基於"第三範式 (3NF)"創建的。這意味著通常都有相當多的表,每個表中的信息列都相對較少。
從數據庫中獲取數據
假設我們希望生成一個包含員工及其工資範圍的表,在我們設計的一個練習中將使用這個表。這個表格不是直接存在在數據庫中,但可以通過向數據庫發出一個查詢來構建它。我們希望得到如下所示的一個表:
Name Min Max
Tully $30,000.00 $45,000.00
Johnson $30,000.00 $45,000.00
Wolff $45,000.00 $60,000.00
Adams $45,000.00 $60,000.00
Smyth $60,000.00 $75,000.00
我們發現,獲得這些表的查詢形式如下所示
SELECT DISTINCTROW Employees.Name, SalaryRanges.Min,
SalaryRanges.Max FROM Employees INNER JOIN SalaryRanges ON Employees.SalaryKey = SalaryRanges.SalaryKey
ORDER BY SalaryRanges.Min;
這種語言稱為結構化查詢語言,即 SQL,而且它是幾乎目前所有數據庫都可以使用的一種語言。SQL-92 標準被認為是一種基礎標準,而且已更新多次。
數據庫的種類
PC 上的數據庫,如 dBase、Borland Paradox、Microsoft Access 和 FoxBase。
數據庫服務器:IBM DB/2、Microsoft SQL Server、 Oracle、Sybase、SQLBase 和 XDB。
所有這些數據庫產品都支持多種相對類似的 SQL 方言,因此,所有數據庫最初看起來好象可以互換。每種數據庫都有不同的性能特征,而且每一種都有不同的用戶界麵和編程接口。
ODBC
如果我們能夠以某種方式編寫不依賴於特定廠商的數據庫的代碼,並且能夠不改變自己的調用程序即可從這些數據庫中得到相同的結果,那將是一件很好的事。如果我們可以僅為所有這些數據庫編寫一些封裝,使它們具有相似的編程接口,這種對數據庫編程獨立於供應商的特性將很容易實現。
什麼是 JDBC?
JDBC 是對 ODBC API 進行的一種麵向對象的封裝和重新設計,它易於學習和使用,並且它真正能夠使您編寫不依賴廠商的代碼,用以查詢和操縱數據庫。盡管它與所有 Java API 一樣,都是麵向對象的,但它並不是很高級別的對象集.
除 Microsoft 之外,多數廠商都采用了 JDBC,並為其數據庫提供了 JDBC 驅動程序;這使您可輕鬆地真正編寫幾乎完全不依賴數據庫的代碼。另外,JavaSoft 和 Intersolv 已開發了一種稱為 JDBC-ODBC Bridge 的產品,可使您連接還沒有直接的 JDBC 驅動程序的數據庫。支持 JDBC 的所有數據庫必須至少可以支持 SQL-92 標準。這在很大程度上實現了跨數據庫和平台的可移植性。
安裝和使用 JDBC
JDBC 的類都被歸到 java.sql 包中,在安裝 Java JDK 1.4時會自動安裝。然而,如果您想使用 JDBC-ODBC 橋。JDBC-ODBC 驅動程序可從 Sun 的 Java 網站 (http://java.sun.com/) 輕鬆地找到並下載。在您擴充並安裝了這個驅動程序後,必須執行下列步驟:
將 \jdbc-odbc\classes; 路徑添加到您的 PATH 環境變量中。
將 \jdbc-odbc\classes; 路徑添加到您的 CLASSPATH 環境變量中。
JDBC 驅動程序的類型
Java 程序連接數據庫的方法實際上有四種:
1. JDBC-ODBC 橋和 ODBC 驅動程序 -- 在這種方式下,這是一個本地解決方案,因為 ODBC 驅動程序和橋代碼必須出現在用戶的每台機器中。從根本上說這是一個臨時解決方案。
2. 本機代碼和 Java 驅動程序 -- 它用另一個本地解決方案(該平台上的 Java 可調用的本機代碼)取代 ODBC 和 JDBC-ODBC 橋。
3. JDBC 網絡的純 Java 驅動程序 -- 由 Java 驅動程序翻譯的 JDBC 形成傳送給服務器的獨立協議。然後,服務器可連接任何數量的數據庫。這種方法使您可能從客戶機 Applet 中調用服務器,並將結果返回到您的 Applet。在這種情況下,中間件軟件提供商可提供服務器。
4. 本機協議 Java 驅動程序 -- Java 驅動程序直接轉換為該數據庫的協議並進行調用。這種方法也可以通過網絡使用,而且可以在 Web 瀏覽器的 Applet 中顯示結果。在這種情況下,每個數據庫廠商將提供驅動程序。
如果您希望編寫代碼來處理 PC 客戶機數據庫,如 dBase、Foxbase 或 Access,則您可能會使用第一種方法,並且擁有用戶機器上的所有代碼。更大的客戶機-服務器數據庫產品(如 IBM 的 DB2)已提供了第 3 級別的驅動程序。
兩層模型和三層模型
當數據庫和查詢它的應用程序在同一台機器上,而且沒有服務器代碼的幹預時,我們將生成的程序稱為兩層模型。一層是應用程序,而另一層是數據庫。在 JDBC-ODBC 橋係統中通常是這種情況。
當一個應用程序或 applet 調用服務器,服務器再去調用數據庫時,我們稱其為三層模型。當您調用稱為"服務器"的程序時通常是這種情況。
編寫 JDBC 代碼訪問數據庫
用 ODBC 注冊您的數據庫
連接數據庫
所有與數據庫有關的對象和方法都在 java.sql 包中,因此在使用 JDBC 的程序中必須加入 "import java.sql.* "。 JDBC 要連接 ODBC 數據庫,您必須首先加載 JDBC-ODBC 橋驅動程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
該語句加載驅動程序,並創建該類的一個實例。然後,要連接一個特定的數據庫,您必須創建 Connect 類的一個實例,並使用 URL 語法連接數據庫。
String url = "jdbc:odbc:Northwind";
Connection con = DriverManager.getConnection(url);
請注意,您使用的數據庫名是您在 ODBC 設置麵板中輸入的"數據源"名稱。
URL 語法可能因數據庫類型的不同而變化極大。
jdbc:subprotocol:subname
第一組字符代表連接協議,並且始終是 jdbc。還可能有一個子協議,在此處,子協議被指定為 odbc。它規定了一類數據庫的連通性機製。如果您要連接其它機器上的數據庫服務器,可能也要指定該機器和一個子目錄:
jdbc:bark//doggie/elliott
最後,您可能要指定用戶名和口令,作為連接字符串的一部分:
jdbc:bark//doggie/elliot;UID=GoodDog;PWD=woof
訪問MSSQL Server方法:(驅動程序需要:msutil.jar,msbase.jar,mssqlServer.jar)
DBDriver=com.microsoft.jdbc.sqlserver.SQLServerDriver
URL=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=demo