第四章 概述
JDBC應(yīng)用程序接口為Java編程語言訪問一個或多個數(shù)據(jù)源提供了一種途徑。在大多數(shù)情況下,數(shù)據(jù)源是用SQL訪問的關(guān)系數(shù)據(jù)庫管理系統(tǒng)。盡管如此,支持JDBC技術(shù)的驅(qū)動程序也可以訪問其他的數(shù)據(jù)源,包括遺留文件系統(tǒng)(legacy file systems)和面向?qū)ο蟮南到y(tǒng)。JDBC應(yīng)用程序接口的一個主要動機就是為應(yīng)用程序可以訪問廣泛的數(shù)據(jù)源提供標(biāo)準(zhǔn)的應(yīng)用程序接口(API)。
這一章介紹了一些JDBC應(yīng)用程序接口的關(guān)鍵概念。除此之外,還描述了JDBC應(yīng)用程序的兩種運行環(huán)境,以及討論了不同的功能角色在每個運行環(huán)境中是怎樣被實現(xiàn)的。兩層和三層邏輯結(jié)構(gòu)能夠在大量的物理結(jié)構(gòu)上被實現(xiàn)。
4.1建立一個連接
JDBC應(yīng)用程序接口定義了Connection接口來表示一個到潛在數(shù)據(jù)源的連接。
在典型情況下,JDBC應(yīng)用程序會用兩種方式中的一種來連接到目標(biāo)數(shù)據(jù)源:
■ DriverManager —— 這個被充分實現(xiàn)的類在最初的JDBC1.0應(yīng)用程序接口中介紹過,它需要應(yīng)用程序裝載一個特定的驅(qū)動,這一驅(qū)動使用硬編碼的統(tǒng)一資源定位器(URL)。
■ DataSource —— 這個接口在JDBC2.0可選包應(yīng)用程序接口(Optional Package API)中介紹過。與DriverManager相比它被作為首選,因為他允許潛在數(shù)據(jù)源的細節(jié)對應(yīng)用程序透明。一個DataSource對象的屬性被設(shè)置以后可以表示一個特定的數(shù)據(jù)源。當(dāng)它的getConnection方法被調(diào)用以后,Datasource的實例將會返回一個到數(shù)據(jù)源的連接。應(yīng)用程序可以通過改變Datasource對象的屬性來連接到不同的數(shù)據(jù)源,而不需要改變應(yīng)用程序的代碼。同樣的,一個DataSource可以在不改變使用它的應(yīng)用程序的代碼的前提下被改變。
JDBC應(yīng)用程序接口還定義了DataSource接口的兩個重要擴展來支持企業(yè)級的應(yīng)用程序。這些擴展就是以下的兩個接口:
■ ConnectionPoolDataSource —— 支持物理連接高速緩沖和重用,物理連接改善了應(yīng)用程序的性能和可伸縮性。
■ XADataSource —— 提供了在分布式事務(wù)中可共享的連接。
4.2執(zhí)行SQL表達式以及操作結(jié)果集
一旦一個連接被建立,那么使用這個連接的應(yīng)用程序就可以用JDBC應(yīng)用程序接口對目標(biāo)數(shù)據(jù)源進行查詢和更新。JDBC3.0應(yīng)用程序接口提供了對大多數(shù)實現(xiàn)了的SQL99特性的支持。因為不同的廠商都在不同的級別支持這些特性,而JDBC應(yīng)用程序接口則包括了DatabaseMetadata接口。應(yīng)用程序能夠使用此接口來確定它們使用的數(shù)據(jù)源是否支持某一特性。JDBC應(yīng)用程序接口還定義了轉(zhuǎn)義語法使得應(yīng)用程序可以訪問非標(biāo)準(zhǔn)的廠商定義的特性。轉(zhuǎn)義語法的優(yōu)點是可以使得JDBC應(yīng)用程序能夠像本地應(yīng)用程序一樣訪問相同的特性,而同時又能夠保證應(yīng)用程序的可移植性。
應(yīng)用程序使用Connection接口中的方法來定義事務(wù)的屬性和創(chuàng)建Statement,PreparedStatement和CallableStatement對象。這些表達式被用來執(zhí)行SQL表達式和檢索結(jié)果集。ResultSet接口封裝SQL的查詢結(jié)果。表達式也可以被批量執(zhí)行,即允許應(yīng)用程序向數(shù)據(jù)源提交多條更新語句作為執(zhí)行的單個單元。
JDBC應(yīng)用程序接口用RowSet接口擴展了ResultSet接口,從而為列表數(shù)據(jù)提供了一個容器,而這樣比標(biāo)準(zhǔn)結(jié)果集更加通用。一個Rowset對象是一個JavaBeans™組件,它可以在沒有連接到數(shù)據(jù)源的情況下對它進行操作。例如,一個RowSet可以被串行化,因此也可以在網(wǎng)絡(luò)之間被傳輸,這對那些想不需要JDBC驅(qū)動和數(shù)據(jù)源連接而對表格數(shù)據(jù)進行操作的小型客戶端是非常有用的。RowSet的另一個特性是能夠包含一個閱讀器來訪問任意表格形式的數(shù)據(jù),而不僅僅是關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)。更進一步的,一個RowSet對象可以在當(dāng)它與數(shù)據(jù)源失去連接的時候更新它的行。它可以包含一個記錄器,把那些更新寫回到潛在的數(shù)據(jù)源。
JDBC應(yīng)用程序接口定義了標(biāo)準(zhǔn)的從SQL數(shù)據(jù)類型到JDBC數(shù)據(jù)類型的映射。這包括對SQL99高級數(shù)據(jù)類型的支持,諸如BLOB,CLOB,ARRAY,REF,STRUCT和DISTINCT。JDBC驅(qū)動也可以為用戶定義類型(UDTs)實現(xiàn)一個或多個自定義類型映射。在這個映射中,用戶定義類型(UDT)被映射到一個Java類中。JDBC3.0應(yīng)用程序接口還添加了對外部數(shù)據(jù)管理的支持,例如一個在數(shù)據(jù)源外部的文件中的數(shù)據(jù)。
4.3兩層結(jié)構(gòu)模型
一個兩層結(jié)構(gòu)模型按功能可以被劃分為客戶端層和服務(wù)器層,見圖4-1。

圖4-1 兩層結(jié)構(gòu)模型
客戶端層包括了應(yīng)用程序和一個或多個JDBC驅(qū)動,應(yīng)用程序負責(zé)對以下職責(zé)進行處理:
■ 表現(xiàn)層邏輯
■ 業(yè)務(wù)邏輯
■ 對多重事務(wù)和分布式事務(wù)的管理
■ 資源管理
在這個模型中,應(yīng)用程序直接與JDBC驅(qū)動交互,包括建立和管理物理連接以及處理潛在的特定的數(shù)據(jù)源的細節(jié)。應(yīng)用程序可以采用特殊的實現(xiàn)采用不標(biāo)準(zhǔn)的特性或性能調(diào)整的優(yōu)點。
這個模型的一些缺點包括:
■ 伴隨著基礎(chǔ)結(jié)構(gòu)和系統(tǒng)級的功能使得表現(xiàn)層邏輯和業(yè)務(wù)層邏輯不能分離。這就為使用一個好的體系結(jié)構(gòu)來編寫可維護性好的產(chǎn)品代碼帶來了困難。
■ 因為采用了特定的數(shù)據(jù)庫實現(xiàn),降低了應(yīng)用程序的可移植性。而那些要求連接到多個數(shù)據(jù)庫的應(yīng)用程序必須知道不同廠商的數(shù)據(jù)庫之間的差異。
■ 限制了可伸縮性。通常地,應(yīng)用程序在結(jié)束之前將保持一個或多個到數(shù)據(jù)庫的物理連接,這樣就限制了它支持并發(fā)應(yīng)用程序的數(shù)量。在這個模型中,性能,可伸縮性和可用性受到JDBC驅(qū)動和相應(yīng)的數(shù)據(jù)源的限制。如果一個應(yīng)用程序采用了多個驅(qū)動,它也可能需要知道每種驅(qū)動和數(shù)據(jù)源解決這些限制的不同方法。
4.4三層結(jié)構(gòu)模型
三層模型結(jié)構(gòu)為業(yè)務(wù)邏輯和基礎(chǔ)結(jié)構(gòu)引入了中間層服務(wù)器,見圖4-2:

圖4-2 三層結(jié)構(gòu)模型
這個體系結(jié)構(gòu)被設(shè)計來為企業(yè)級的應(yīng)用程序提高性能,可伸縮性和可用性。三個層的功能分別為:
1、 客戶端層 —— 為程序和人的交互實現(xiàn)表現(xiàn)層邏輯的一個層。Java程序,瀏覽器和掌上電腦(PDAs)是常見的客戶端實例。客戶端與中間層應(yīng)用程序交互而且不需要包含任何與基礎(chǔ)結(jié)構(gòu)和數(shù)據(jù)源相關(guān)的功能。
2、 中間層服務(wù)器 —— 中間層包括:
■ 和客戶端以及業(yè)務(wù)邏輯層交互的應(yīng)用程序。如果該應(yīng)用程序能夠與數(shù)據(jù)源交互,和低級的驅(qū)動應(yīng)用程序接口相比,他將更多地處理像DataSource對象和邏輯連接這些高級抽象。
■ 為廣泛的應(yīng)用程序提供基礎(chǔ)的應(yīng)用程序服務(wù)器。這包括管理和共享物理連接、事務(wù)管理和屏蔽不同JDBC驅(qū)動之間的差異。最后一點使得編寫可移植性良好的應(yīng)用程序更加簡單。J2EE服務(wù)器可以實現(xiàn)應(yīng)用程序服務(wù)器這一角色。應(yīng)用程序服務(wù)器可以實現(xiàn)被應(yīng)用程序所使用的高級抽象和直接與JDBC驅(qū)動交互。
■ JDBC驅(qū)動提供到潛在數(shù)據(jù)源的連接。每個驅(qū)動程序在它所使用的數(shù)據(jù)源所支持的特性基礎(chǔ)上實現(xiàn)標(biāo)準(zhǔn)的JDBC應(yīng)用程序接口。驅(qū)動層可以屏蔽標(biāo)準(zhǔn)SQL99語法和數(shù)據(jù)源所支持的本地語法之間的差異。如果數(shù)據(jù)源不是一個關(guān)系數(shù)據(jù)庫管理系統(tǒng),那驅(qū)動程序則使用應(yīng)用程序服務(wù)器實現(xiàn)關(guān)系層。
3、 潛在數(shù)據(jù)源 —— 即數(shù)據(jù)駐留層。它包括關(guān)系型數(shù)據(jù)庫管理系統(tǒng),遺留文件系統(tǒng)(legacy file systems),對象型數(shù)據(jù)庫管理系統(tǒng),數(shù)據(jù)倉庫,電子表格或者其他形式的數(shù)據(jù)。唯一的要求就是有相應(yīng)的支持JDBC應(yīng)用程序接口的驅(qū)動程序。
4.5在J2EE平臺中的JDBC
J2EE組件,例如JavaServer™ Pages,Servlets和企業(yè)級Java Beans™(EJB™)組件,常常需要使用JDBC應(yīng)用程序接口來訪問關(guān)系型數(shù)據(jù)。當(dāng)J2EE組件使用了JDBC應(yīng)用程序接口以后,那么可以使用相應(yīng)的容器來管理它們的事務(wù)和數(shù)據(jù)源。這意味著J2EE組件開發(fā)人員可以不直接使用JDBC應(yīng)用程序接口的事務(wù)管理和數(shù)據(jù)源管理的工具。具體細節(jié)請參考J2EE平臺規(guī)范。