JDBC 2.0和4.0

zengbo0710發表於2007-05-21

第一章 介紹

1.1 JDBC類庫

JDBC類庫提供了通過Java語言訪問關聯式資料庫的能力。Java程式通過JDBC可以執行SQL語句,對獲取的資料進行處理,並將變化了的資料存回資料庫。在分散式異構環境中,我們還可以通過JDBC操縱多個資料來源。

 

 

JDBC類庫基於X/Open SQL通用語言介面(CLI),ODBC也基於此。JDBC提供了一個使用方便的對映方案:從Java語言到X/Open 通用語言介面和SQL標準的抽象實體及概念的對映。

 

 

自1997年的產生至今,JDBC類庫已被廣泛的接受和實現。類庫的靈活性使得它可以有很多個具體實現。

 

 

 

1.2 平臺

JDBC類庫是Java平臺的一部分。4.0版分為兩個包:java.sql 和 javax.sql。這兩個包都包含在JSE(Java桌面版)和JEE(Java企業版)中。

 

 

 

1.3 適合讀者

該文件主要面向下列產品的開發者:

* JDBC驅動程式

* 基於資料庫驅動提供三層架構服務的應用伺服器

* 使用JDBC類庫來提供服務的工具

 

 

該文件想達到以下目的:

* 對使用JDBC類庫的開發者的一個介紹

* 作為開發基於JDBC的類庫的起始點

第二章 目標

 

2.1 歷史

JDBC API是一種成熟的技術,最早釋出是1997年1月。在最初的版本中,JDBC API著重提供一個對SQL資料庫的基本呼叫級介面。之後,JDBC 2.1規範和2.0可選包規範拓寬了API的範圍。包括支援更高階應用和管理使用JDBC API來增強其應用的應用服務所需的各項特徵。

JDBC 3.0規範以填補較小範圍內的功能缺失為目標。對於JDBC 4.0,我們的目標有兩個:提高所有開發者在JAVA平臺使用SQL開發的易用性。第二,提供企業級特性的JDBC工具集和API來管理JDBC資源。

 

2.2 目標概述

下面列出了一般的JDBC API和JDBC 4.0 API的目標和設計原理:

 

1.適合J2EE和J2SE平臺

JDBC API是JAVA平臺的重要技術。JDBC 4.0 API應遵循JAVA 2 企業版和JAVA 2 標準版平臺的總體方向。另外,最近開發的JAVA 5.0平臺已經展示出一系列新的特性和語言的改進,並在本規範中廣泛使用。

 

2.相容SQL:2003

JDBC API提供用JAVA程式語言編寫標準SQL來對應用進行程式級訪問能力。JDBC 3.0致力於確保其可以支援可廣泛支援工業的具有SQL:99特徵的子集。對於JDBC 4.0也一樣,支援SQL:2003是本規範的一個主要組成部分。我們期望在不久的將來可以實現。

 

3.鞏固以前的規範

本文件把4個以前的JDBC規範組織成一個單一的JDBC API規範。

 

4.提供中立於開發商的一般訪問特性

JDBC API致力於提供支援針對不同開發商應用的高頻寬的一般訪問特徵。其目標是提供與原生應用可以達到的同級別的訪問特性。然而,本API必須足夠通用和靈活以適應大範圍的實施。

 

5.關注於SQL

JDBC API一直關注於用JAVA程式語言訪問相關資料。這個目標曾在JDBC 3.0 API規範中說明,在本規範中仍是一個主要原則。提供API和工具來改進開發難度,並繼續集中於在JAVA平臺開發基於SQL的軟體的需要。與以前的規範相似,本規範也不阻止與其它技術進行互動,如XML,CORBA和非關係型資料。

 

6.提供基礎資料和更高階別的API

JDBC API提供標準API訪各種資料來源或舊系統。實施的差異使通過JDBC API抽象透明化。這使其成為對想開發可移動工具和應用的工具開發商來說,一個有價值的目標平臺。由於它是一個用JAVA程式語言對SQL的“呼叫”級介面,所以JDBC API也適用於更高階別應用的底層,如EJB 3.0容器管理的永續性,SQLJ和JDBC的RowSet實現。

 

7.保持簡單

JDBC API意欲成為一種使用簡單、直接的介面。在之上可以構建更多複雜的實體。這個目標通過定義大量緊湊、單一目的方法來代替少數帶有控制標識引數的複雜、多目的的方法來實現。

 

8.增強可靠性、可用行和可測性

可靠性、可用行和可測性是J2EE和J2SE平臺的主題,也是未來JAVA平臺的主題。JDBC 4.0 API嚴格按照以上目標進行。它擴充套件支援了一些領域,包括資源管理、對邏輯連線預備宣告的複用和錯誤處理。

 

9.支援對已有應用和驅動的向後相容

使用已有JDBC技術的驅動和應用必須能夠在支援JDBC 4.0 API的JAVA虛擬機器上繼續工作。那些只使用更早版本中定義的JDBC API(不包括在JDBC 2.0中已廢除的)的應用,應該不需要修改就可以繼續執行。已有的應用應該可以直接遷移到JDBC 4.0技術。

 

10.與JDBC RowSet?工具緊密聯絡

J2SE 5.0包含一個標準JDBC RowSet?工具(在《JDBC RowSet?工具集》中說明(JSR-114))。本規範會提供一個工具集包括工具類級別和後設資料語言級別的工具。它允許開發者輕易的把使用JDBC技術的應用遷移到JDBC RowSet?模型。該模型可以斷開資料來源訪問連線,另外能夠管理來自於XML駐留點的關係資料儲存。

 

11.允許對聯結器的向前相容

聯結器構架定義了一個標準方法來對資源介面卡進行打包和佈署。它允許一個J2EE容器整合它與外部資源的連線、處理和安全管理。JDBC 4.0 API提供JDBC驅動到聯結器架構的遷移路徑。對那些產品中使用JDBC技術的開發商來說,應可以轉向對聯結器API的實現。希望這些實現會重新包裝已有資料來源的實現。這樣他們可以對聯結器框架進行復用。

 

12.清晰的列明需求

遵從JDBC要求的需求,要明確和易於識別。JDBC 4.0規範和API文件(Javadoc)會明晰什麼特性是需要的,什麼特性是可選的。

第三章 新特性概述

 

3.1 變更概述

JDBC 4.0 API在如下領域引入新事物和變化:

 

 

  • 自動載入java.sql.Driver

 

修改DriverManager.getConnection,利用J2SE服務提供機制自動載入JDBC驅動。取消呼叫Class.forName的需要。

 

 

  • 易於開發API

 

加入了許多標準JDBC註解並支援通用DataSet以利於Java應用程式與SQL資料來源的互動。

 

 

  • ROWID資料型別

 

加入java.sql.RowID資料型別。允許JDBC程式訪問SQL ROWID。

 

 

  • 國際字符集置換支援

 

增加了NCHAR、NVARCHAR、LONGNVARCHAR和NCLOB等JDBC型別。在PreparedStatement介面中增加了setNCharacterStream、setNClob方法。

 

 

  • 增強支援BLOB、CLOB

 

在Connection介面中加入額外的方法,允許建立BLOB、CLOB物件。PreparedStatement介面已有使用InputStream 物件插入BLOB物件的方法和用Reader物件CLOB、NCLOB物件的方法。Blob、Clob和Nclob介面已增加了方法可以釋放已獲得的物件資源。

 

 

  • 支援SQL/XML和XML

 

SQL2003介紹了在SQL datastor中如何表達XML資料的想法。這裡另加入新的API使應用程式可以訪問以上資料。

 

 

  • 打包模式

 

增加了解開JDBC class的能力,以使用開發商提供的非標準JDBC方法。

 

 

  • 增強SQLException

 

加入了支援J2SE例外。SQLException現在支援迭代介面,允許在for-each迴圈中使用。加入了兩類SQLException: SQLTransientException?和SQLNonTransientExeption.。每類提供新的SQLException子類以對映公共 SQLState類值。

 

 

  • 連線管理

 

增強Connection和Statement介面,改善對連線狀態的跟蹤,在池環境中對狀態物件的管理更具靈活性。

 

 

  • JDBC API變更

 

如下JDBC介面發生了變更:

 

 

  • Connection

 

增加了createBlob、createClob、createNClob、createQueryObject、isValid、reateXML、getClientInfo、setClientInf方法。

 

 

  • CallableStatement?

 

增加了getRowId、setRowId、getNClob、setNString、setNCharacterStream、setNClob、getSQLXML、setSQLXML方法。覆蓋了setClob和setBlob方法。

 

 

  • DatabaseMetaData?

 

增加了getRowIdLifetime、autoCommitFailureClosesAllResultSets、 providesQueryObjectGenerator、getClientInfoProperties和 supportsStoredFunctionsUsingCallSyntax方法。覆蓋了getSchemas方法。

 

 

  • PreparedStatement?

 

增加了setRowId, setNString, setNCharacterStream、setSQLXML、isPoolable、setPoolable和setNClob方法。覆蓋了setClob和setBlob方法。

 

 

  • ResultSet?

 

增加了getHoldability、getRowId、updateRowID、getNClob、isClosed、updateNString、getSQLXML、updateSQLXML和updateNClob方法。

 

 

  • Statement

 

增加了isClosed和getResultSetHoldability方法。

 

 

  • DataSource?

 

增加了createQueryObject方法。

 

 

  • PooledConnection?

 

增加了addStatementEventListener和removeStatementEventListener方法。

 

 

 

 

詳見第五章《類與介面》中受以上變更影響的類和介面的清單

第四章 概述

JDBC API提供了讓java程式訪問一個或多個資料來源的方法。主流的案例中,資料來源是關聯式資料庫,資料的訪問通過SQL。當然,也可以在其它資料來源(如傳統的文件系統和麵向物件系統)上實現JDBC驅動。JDBC API的主要動力是提供一套面向應用的標準API,以訪問多種資料來源。

本章介紹JDBC API的一些關鍵概念。另外,介紹兩種JDBC應用的公共環境,並討論各自實現的功能性差異。兩層和三層模型是兩種邏輯結構,它們可以在各種物理結構中實現。

 

4.1 建立連線

JDBC API定義了Connection介面來表示對資料來源的連線。

典型的方案是,一個JDBC應用使用下面兩種機制之一來連線一個目標資料來源:

 

 

  • DriverManager?—該類已完全實現,並在最早的JDBC 1.0 API已引入。它需要應用程式使用一個固定編碼的URL載入一個專門的驅動。

 

 

 

  • DataSource?—該介面在JDBC 2.0 Optional Package API中引入。最好是跳過DriverManager,因為它要求底層資料來源的詳細資訊對應用程式透明。一個DataSource物件的屬性是一批。因此,它表示一個獨有的資料來源。當它的getConnection方法被呼叫,該DataSource例項會返回一個對那個資料來源的連線。一個應用程式可以直接連線到多個資料來源,只需要改變DataSource物件屬性即可,不需要改變應用程式程式碼。同樣的可以改變一個DataSource實現而無需改變使用它的應用程式程式碼。

 

JDBC API也定義了DataSource介面兩種重要的擴充套件來支援企業應用。即為如下兩個介面:

 

 

  • ConnectionPoolDataSource? —支援對物理連線的快取和複用,以提高應用的效能和可伸縮性。

 

 

 

  • XADataSource? —提供連線使之可以進行頒分散式處理。

 

 

4.2 執行SQL宣告和操作結果集

一旦連線建立,應用程式就可以使用JDBC API對目標資料來源執行查詢和更新。JDBC API提供訪問大多資料具有SQL2003特性的一般實現的能力。因為不出廠商在這些特性中支援的級別不同,JDBC API包含了DatabaseMetadata介面。應用程式可以使用該介面來決定它們使用的資料來源是否支援某一特性。JDBC API也定義了escape syntax以允許應用程式訪問非標準廠商提供的特性。使用escape syntax給JDBC應用作為原生應用訪問相同特性集帶來了好處,同時也為維護應用程式的可移動性帶來了好處。

應用程式使用Connection介面中的方法來指明處理屬性並建立Statement、PreparedStatement或者 CallableStatement?物件。這些宣告用於執行SQL宣告並獲取結果集。ResultSet介面封裝了SQL查詢結果集。宣告可以是批量的,允許應用程式對一個資料來源提交多個更新作為一個單元來執行。

JDBC API通過RowSet介面擴充套件了ResultSet介面,因此可以提供一個表格型資料容器。該容器比標準結果集更具通用性。RowSet物件是一個 JavaBeans?元件,它可以在不連線資料來源的情況下進行操作。例如:一個RowSet實現可以被序列化並通過網路傳送出去。這對小空間客戶端希望操作表型資料而不想帶入額外的JDBC驅動和資料來源連線尤其有用。RowSet實現的另一個特徵是它可以使使用者訪問任何具有表型格式的資料,不僅僅是關聯式資料庫資料。另外,一個RowSet物件可以在與資料來源斷開的情況下更新行,並且該實現可以讓使用者把這些更新寫入到底層的資料來源。

 

4.2.1 支援SQL高階資料型別

JDBC API定義了標準對映把SQL資料型別轉換成JDBC資料型別或者相反。這包括支援SQL2003高階資料型別如BLOB、CLOB、ARRAY、 REF、STRUCT和DISTINCT。JDBC驅動也可以實現更多定製型別對映以支援使用者定義型別(UDTs)。這時UDT被對映成為Java語言中的一個類。JDBC API也提供支援其它可管理的資料,如在資料來源之外的一個文件。

 

4.3 兩層模型

兩層模型按功能分成了客戶層和服務層,如圖4-1:

http://www.pgsqldb.org/twiki/pub/PgSQL/OverView/4.1.bmp

客戶層包括應用程式和一個或多個JDBC驅動,應用程式負責處理如下領域:

 

 

  • 表示邏輯
  • 業務邏輯
  • 多指令(multiple-statement)事務或分佈事務的事務管理
  • 資源管理

 

在此模型中,應用程式直接與JDBC驅動互動,包括建立和管理物理連線及對底層資料來源實現的細節處理。應用程式可以利用非標準特性實現它的專有功能或進行執行優化。此模型的一些缺點是:

 

 

  • 在基礎構架上和系統級功能上,混雜了表示邏輯和業務邏輯。這使得在優良定義的構架中建立可維護程式碼帶來了障礙。

 

  • 由於針對專門的資料庫進行了優化,使得應用程式缺乏可移植性。應用程式如需連線多種資料庫必須考慮不同廠商間實現的差異。

 

  • 有限的伸縮性。典型的,應用程式會對資料庫保持一個或多個物理連線,直到其結束。應用程式會支援有限的併發。在此模型中,JDBC驅動來負責效能、可伸縮性和可用性等問題以及對底層資料來源的響應。如果一個應用程式使用多個驅動,還要考慮每個驅動/資料來源對之間處理問題的不同差異。

 

 

4.4 三層模型

三層模型引入了中間層服務,駐留業務邏輯和底層結構。如下圖4-2所示:

http://www.pgsqldb.org/twiki/pub/PgSQL/OverView/4.2.bmp

此構架的設計用來改善企業應用的效能、可伸縮性和可用性。各層功能劃分如下:

 

  1. 客戶層—該層實現與人互動的表示邏輯。Java程式、web瀏覽器和PDA是典型的客戶層實現。客戶與中間層應用互動並不需要知道底層結構或底層資料來源的功能。
  2. 中間層服務—中間層包括:

 

 

    • 應用程式與客戶互動並實現業務邏輯。如果應用程式包括與資料來源互動,它會進行更高階的抽象,如DataSource物件和邏輯連線而不是更低階的驅動API。

 

 

 

    • 一個應用伺服器提供支援各種應用的基礎結構。包括對物理連線的管理和連線池、事務管理和遮蔽不同JDBC驅動之間的差異。最後一點使得更容易編寫可移植應用程式。應用伺服器可以用J2EE伺服器實現。應用伺服器實現對使用的應用和與JDBC驅動直接互動的更高階抽象。

 

 

 

    • JDBC驅動提供對底層資料來源的連線。每個驅動根據底層資料來源支援的特性實現標準JDBC API。驅動層可以遮蔽標準SQL2003與資料來源支援的內部語言的差異。如果資料來源不是關聯式資料庫,驅動會實現關係層供應用伺服器使用。

 

 

  1. 底層資料來源—該層為資料駐留層。它可以包括關聯式資料庫、傳統檔案系統、物件導向資料庫、資料倉儲、電子表格或其它方式的資料表示或資料包裝。它只需要相應的驅動來支援JDBC API。

 

4.5 J2EE平臺的JDBC

J2EE元件,如JavaServer Pages、Servlets和Enterprise Java Beans(EJB)元件,經常需要訪問關係資料和使用JDBC API進行訪問。當J2EE元件使用JDBC API時,該容器對事務和資料來源進行管理。這也就是說J2EE元件開發人員不直接使用JDBC API的事務管理和資料來源管理工具。需要更多細節參見J2EE平臺說明書。

第五章 類和介面

以下類和介面組成了JDBC類庫

 

5.1 java.sql包

JDBC核心類庫包含在java.sql包中。java.sql包中的註釋(annotations)、列舉、類和介面如下。註釋、列舉和類使用粗體;介面使用正常字型。

java.sql.AutoGeneratedKeys
java.sql.Array
java.sql.BaseQuery
java.sql.BatchUpdateException
java.sql.Blob
java.sql.CallableStatement
java.sql.ClientInfoException
java.sql.Column
java.sql.Clob
java.sql.Connection
java.sql.DataSet
java.sql.DataTruncation
java.sql.DatabaseMetaData
java.sql.Date
java.sql.Driver
java.sql.DriverManager
java.sql.DriverPropertyInfo
java.sql.NClob
java.sql.ParameterMetaData
java.sql.PreparedStatement
java.sql.Query
java.sql.QueryObjectFactory
java.sql.QueryObjectGenerator
java.sql.Ref
java.sql.ResultSet
java.sql.ResultSetMetaData
java.sql.RowId
java.sql.RowIdLifeTime
java.sql.Savepoint
java.sql.SQLData
java.sql.SQLDataException
java.sql.SQLException
java.sql.SQLInput
java.sql.SQLIntegrityConstraintViolationException
java.sql.SQLInvalidAuthorizationSpecException
java.sql.SQLNonTransientConnectionException
java.sql.SQLNonTransientException
java.sql.SQLOutput
java.sql.SQLPermission
java.sql.SQLSyntaxErrorException
java.sql.SQLTimeoutException
java.sql.SQLTransactionRollbackException
java.sql.SQLTransientConnectionException
java.sql.SQLTransientException
java.sql.SQLXML
java.sql.SQLWarning
java.sql.Statement
java.sql.Struct
java.sql.Table
java.sql.Time
java.sql.Timestamp
java.sql.Types
java.sql.Update
java.sql.Wrapper

下列類和介面是新增的或經過修改的。新的類和介面用粗體標出。

java.sql.AutoGeneratedKeys
java.sql.BaseQuery
java.sql.Blob
java.sql.CallableStatement
java.sql.ClientInfoException
java.sql.Clob
java.sql.Column
java.sql.Connection
java.sql.DatabaseMetaData
java.sql.NClob
java.sql.PreparedStatement
java.sql.Query
java.sql.QueryObjectFactory
java.sql.QueryObjectGenerator
java.sql.ResultSet
java.sql.RowId
java.sql.RowIdLifeTime
java.sql.SQLDataException
java.sql.SQLException
java.sql.SQLIntegrityConstraintViolationException
java.sql.SQLInvalidAuthorizationSpecException
java.sql.SQLNonTransientConnectionException
java.sql.SQLNonTransientException
java.sql.SQLSyntaxErrorException
java.sql.SQLTimeoutException
java.sql.SQLTransactionRollbackException
java.sql.SQLTransientConnectionException
java.sql.SQLTransientException
java.sql.SQLXML
java.sql.SQLWarning
java.sql.Statement
java.sql.Table
java.sql.Types
java.sql.Update
java.sql.Wrapper
javax.sql.CommonDataSource
javax.sql.StatementEvent
javax.sql.StatementEventListener

圖5-1顯示了java.sql包中關鍵類和介面之間的互動和關係,以及用於建立語句、設定引數、檢索結果的方法。
r_java.sql.gif

圖5-1 java.sql包中主要類和介面之間的關係

 

5.2 javax.sql包

java.sql包中的類和介面如下。類使用粗體;介面使用正常字型。

javax.sql.CommonDataSource
javax.sql.ConnectionEvent
javax.sql.ConnectionEventListener
javax.sql.ConnectionPoolDataSource
javax.sql.DataSource
javax.sql.PooledConnection
javax.sql.RowSet
javax.sql.RowSetEvent
javax.sql.RowSetInternal
javax.sql.RowSetListener
javax.sql.RowSetMetaData
javax.sql.RowSetReader
javax.sql.RowSetWriter
javax.sql.StatementEvent
javax.sql.StatementEventListener
javax.sql.XAConnection
javax.sql.XADataSource

 


注意 :javax.sql包中的類和介面最開始是作為JDBC 2.0可選包引入的。可選包獨立於java.sql包提供。 現在兩者都包含在J2SE 1.4中。


圖5-2,圖5-3,圖5-4和圖5-5顯示了以下功能領域中關鍵類和介面之間的關係:DataSource物件,池化連線,分散式事務,行集。

r_5_2.gif

圖5-2 javax.sql.DataSource和java.sql.Connection之間的關係

r_5_3.gif

圖5-3 連線池化過程中涉及的關係

o_5_4.gif

圖5-4 分散式事務支援中涉及的關係

r_5_5.gif

圖5-5 行集涉及的關係

 

第6章 相容性

這一章描述了JDBC類庫實現在各個相容級別要支援的特性。一個JDBC類庫實現包含了一個JDBC驅動和底層資料來源。相容性定義了在驅動層之上要實現的特性。

任何沒有提到的特性都是可選的。通常,如果底層資料來源不支援,驅動不需要實現這個特性。

 

6.1 定義

為了避免混淆,我們將在相容性的討論中使用以下術語:

 

  • JDBC類庫實現 --- 一個JDBC驅動和它的底層資料來源。驅動可能提供對底層資料來源沒有實現的特性的支援。它也可能提供標準語法/語義到資料來源本地類庫的對映。

 

  • 相關規範 --- 這個類庫規範以及其他相關的SQL規範。如果一個特性在多個文件裡被描述,我們應該考慮被排在最前面的文件。對於JDBC 1.0類庫來說,相關的SQL規範包括SQL92和X/Open SQL CLI。對於JDBC2.0和3.0類庫,它包括SQL92加上SQL99和X/Open SQL CLI的相關部分。對於JDBC 4.0類庫,它包括SQL92以及SQL2003和X/Open SQL CLI的相關部分。

 

  • 支援特性 --- 在相關規範中定義了特性的標準語法和語義,JDBC類庫實現要按照語法和語義的規定支援這些特性。

 

  • 擴充套件 --- 一個沒有被相關規範定義的特性,或者是,相關規範中特性的非標準實現。

 

  • 完整實現 --- 一個介面的所有方法都被實現。

 

  • 需要的介面 --- 要支援的介面,但不一定要完整實現。介面裡沒有實現的方法應丟擲SQLException,說明不支援該特性。

 

6.2 指導原則和要求

下列指導原則適合所有級別的相容性:

 

  • 一個JDBC類庫實現必須支援入門級別SQL92(Entry Level SQL92)和“Drop Table”SQL命令(請參照注意事項)。

入門級別SQL92(Entry Level SQL92)是JDBC類庫實現要支援的最低SQL級別。對SQL99或SQL2003中特性的訪問應該與SQL99或SQL2003規範的相關部分一致。


 

  • 驅動必須支援轉義語法。轉義語法將在第13章“語句”中講述。

 

  • 驅動必須支援事務。詳見第9章“事務”。

 

  • 驅動應該提供對底層資料來源所有特性的訪問,包括擴充套件了JDBC類庫的特性。如果一個特性沒有被支援,特性對應的方 法應該丟擲SQLException。這樣使得JDBC程式可以訪問與本地應用相同的特性集。

 

  • 如果從DatabaseMetaData的方法得知驅動支援給定的特性,則驅動要保證特性的語法和語義應該跟相關規範一致。這意味著,如果資料來源的本地類庫或語法與標準不一致,驅動要提供相應的對映。

 

  • 支援一個特性,還必須實現相關的後設資料方法。例如,一個驅動支援RowSet介面,它還要實現RowSetMetaData介面。

 

  • 不支援一個特性,則對應的DatabaseMetaData方法要“拒絕訪問”:對不支援特性的方法的訪問要丟擲SQLException。

 


注意 :JDBC類庫實現要支援“SQL92 - 過渡級別”中定義的DROP TABLE命令,但對CASCADE和RESTRICT選項的支援 是可選的。而且,當要被刪除的表有檢視(views)和完整性約束時,DROP TABLE的行為也是實現類庫的廠商自己定義的。


 

6.3 JDBC 1.0 類庫相容性

與JDBC 1.0 類庫相容的驅動應滿足以下條件:

  • 遵守前述指導原則和要求
  • 完整實現下列介面:
    • java.sql.Driver
    • java.sql.DatabaseMetaData(除了在高版本中引入的方法)
    • java.sql.ResultSetMetaData(除了在高版本中引入的方法)
  • 包含下列需要的介面(“需要的介面”的定義見6.1)
    • java.sql.CallableStatement
    • java.sql.Connection
    • java.sql.PreparedStatement
    • java.sql.ResultSet
    • java.sql.Statement

 

6.4 JDBC 2.0 類庫相容性

與JDBC 2.0 類庫相容的驅動應滿足以下條件:

  • 遵守JDBC 1.0 類庫需求
  • 在DatabaseMetaData中增加下列方法的實現:
    • deletesAreDetected
    • getConnection
    • getUDTs
    • insertsAreDetected
    • othersDeletesAreVisible
    • othersInsertsAreVisible
    • othersUpdateAreVisible
    • ownDeletesAreVisible
    • ownInsertsAreVisible
    • ownUpdatesAreVisible
    • supportsBatchUpdates
    • supportsResultSetConcurrency
    • supportsResultSetType
    • updatesAreDetected

 

  • 在ResultSetMetaData裡增加下列方法的實現:
    • getColumnClassName
    • getColumnType
    • getColumnTypeName

 

6.5 JDBC 3.0 類庫的相容性

與JDBC 3.0 類庫相容的驅動應滿足以下條件:

  • 遵守JDBC 1.0 類庫需求
  • 包含下列需要的介面:
    • java.sql.ParameterMetaData
    • java.sql.Savepoint
  • 在DatabaseMetaData中增加下列方法的實現:
    • supportsSavepoints
    • supportsNamedParameters
    • supportsMultipleOpenResults
    • supportsGetGeneratedKeys
    • getSuperTypes
    • getSuperTables
    • getAttributes
    • getResultSetHoldability
    • supportsResultSetHoldability
    • getSQLStateType
    • getDatabaseMajorVersion
    • getDatabaseMinorVersion
    • getJDBCMajorVersion
    • getJDBCMinorVersion

 

6.6 JDBC 4.0 類庫的相容性

與JDBC 4.0 類庫相容的驅動應滿足以下條件:

  • 遵守JDBC 3.0 類庫需求
  • 包含下列需要的介面:
    • java.sql.RowId
    • java.sql.QueryObjectGenerator
    • java.sql.DataSet
  • 在DatabaseMetaData裡增加下列方法的實現:
    • getRowIdLifetime
    • supportsStoredFunctionsUsingCallSyntax
    • providesQueryObjectGenerator

 


注意 :這一段將在下一版草案更新


 

6.7 決定相容級別

JDBC 類庫是Java平臺不可或缺的一部分。與JDBC類庫規範相容是與整個平臺相容的一個子集。

 


注意 :在編寫這個文件之際,還沒有獨立於平臺檢查JDBC類庫相容級別的。


 

6.8 不贊成使用的類庫

不贊成使用是針對類、介面、構造器、方法或欄位來說的,即不再被推薦使用,而且可能在將來某個版本不復存在。

JDBC 2.0類庫中不贊成使用的構造器和方法:

java.sql.CallableStatement.getBigDecimal(int, int)

java.sql.Date(int, int, int)
java.sql.Date.getHours()
java.sql.Date.getMinutes()
java.sql.Date.getSeconds()
java.sql.Date.setHours(int)
java.sql.Date.setMinutes(int)
java.sql.Date.setSeconds(int)

java.sql.DriverManager.getLogStream()
java.sql.DriverManager.setLogStream(PrintStream?)

java.sql.PreparedStatement.setUnicodeStream(int, InputStream?, int)

java.sql.ResultSet.getBigDecimal(int, int)
java.sql.ResultSet.getBigDecimal(String, int)
java.sql.ResultSet.getUnicodeStream(int)
java.sql.ResultSet.getUnicodeStream(String)

java.sql.Time(int, int, int)
java.sql.Time.getDate()
java.sql.Time.getDay()
java.sql.Time.getMonth()
java.sql.Time.getYear()
java.sql.Time.setDate(int)
java.sql.Time.setMonth(int)
java.sql.Time.setYear(int)

java.sql.Timestamp(int, int, int, int, int, int, int)

 

資料庫後設資料

第7章 資料庫後設資料

JDBC驅動通過實現DatabaseMetaData介面來提供底層資料來源的資訊。DatabaseMetaData介面主要被應用伺服器和工具使用,以此決定怎樣跟給定資料來源互動。應用也可以通過DatabaseMetaData的方法得到資料來源的資訊,但這不常用。

DatabaseMetaData?介面有超過150個方法,根據提供的資訊可以分為以下幾類:

  • 提供資料來源的一般資訊
  • 判斷資料來源是否支援某種特性或具有某種能力
  • 資料來源的限制
  • 資料來源包含哪些SQL物件以及這些物件的屬性
  • 資料來源提供的事務支援

DatabaseMetaData?介面還有超過40個欄位,這些欄位用於DatabaseMetaData中各種方法的常量返回值。

這一章粗略介紹一下DatabaseMetaData介面,通過舉例子對後設資料方法進行分類,同時介紹一些新的方法。詳細介紹請參考JDBC 4.0 類庫規範

JDBC中的ResultSetMetaData介面將在第15章“結果集”介紹。

 

7.1 建立DatabaseMetaData物件

DatabaseMetaData?物件由Connection的getMetaData方法建立,然後我們可以利用它來動態獲取底層資料來源的資訊。程式碼示例 7-1 建立了一個DatabaseMetaData物件,並用它來檢視錶名允許的最大字元數。

 

// con是一個Connection物件DatabaseMetaData dbmd = con.getMetadata();int maxLen = dbmd.getMaxTableNameLength();

程式碼示例 7-1 建立和使用DatabaseMetaData物件

 

7.2 獲取一般資訊

DatabaseMetaData?中有一類方法用於獲取底層資料來源的一般資訊,或者它的一些實現細節。這類方法有:

  • getURL
  • getUserName
  • getDatabaseProductVersion, getDriverMajorVersion 和 getDriverMinorVersion
  • getSchemaTerm, getCatalogTerm 和 getProcedureTerm
  • nullsAreSortedHigh 和 nullsAreSortedLow
  • usesLocalFiles 和 usesLocalFilePerTable
  • getSQLKeywords

 

7.3 檢視支援的特性

大量DatabaseMetaData方法可以用來判斷驅動或底層資料來源是否支援某個特性或特性集。還有一些方法可以告知提供支援的級別。

判斷是否支援某個特性的方法如下:

  • supportsAlterTableWithDropColumn
  • supportsBatchUpdates
  • supportsTableCorrelationNames
  • supportsPositionedDelete
  • supportsFullOuterJoins
  • supportsStoredProcedures
  • supportsMixedCaseQuotedIdentifiers

檢視特性支援級別的方法:

  • supportsANSI92EntryLevelSQL
  • supportsCoreSQLGrammar

 

7.4 資料來源限制

另一組方法提供資料來源對操作的限制資訊,如下:

  • getMaxRowSize
  • getMaxStatementLength
  • getMaxTablesInSelect
  • getMaxConnections
  • getMaxCharLiteralLength
  • getMaxColumnsInTable

方法返回一個整型的限制數。0表示沒有限制或未知限制。

 

7.5 SQL物件及其屬性

DatabaseMetaData?中有一組方法提供組成資料來源之SQL物件的資訊。這組方法也包含獲取SQL物件屬性的方法。方法的返回值是一個ResultSet,ResultSet的每一行代表一個特定物件。例如,getUDTs方法返回的ResultSet裡每一行都是資料來源裡定義的一個UDT(user-defined type)。這類方法主要有:

  • getSchemas
  • getCatalogs
  • getTables
  • getPrimaryKeys
  • getProcedures
  • getProcedureColumns
  • getUDTs

 

7.6 事務支援

一小部分方法提供資料來源所支援事務的語義資訊。這類方法主要有:

  • supportsMultipleTransactions
  • getDefaultTransactionIsolation

 

7.7 新增方法

JDBC 4.0 類庫在DatabaseMetaData中引入了下列新方法:

  • getSchemas --- 過載了已有的getSchemas方法,使用目錄和模式作為引數。
  • supportsStoredFunctionsUsingCallSyntax --- 判斷使用者或廠商自定義的方法是否可以使用儲存過程轉義語法來呼叫。
  • autoCommitFailureClosesAllResultSets --- 當autoCommit設定為true時,標示程式錯誤丟擲SQLException後是否所有開啟著的結果集(包括持久(holdable)結果集)都被關閉。
  • providesQueryObjectGenerator --- 標示JDBC驅動是否提供自己的QueryObjectGenerator實現。
  • getClientInfoProperties --- 獲取驅動支援的客戶端屬性列表。

這些方法的完整定義見JDBC 4.0 類庫規範(javadoc)。

 

7.8 經過修改的方法

JDBC 4.0 類庫修改了DatabaseMetaData中下列方法的定義:

  • getTypeInfo --- 如果資料庫支援SQL distinct型別,則getTypeInfo()返回一行TYPE_NAME欄位為DISTINCT,DATA_TYPE欄位為Types.DISTINCT的一行資料。如果資料庫支援SQL結構化型別,則getTypeInfo()返回TYPE_NAME欄位為STRUCT、DATA_TYPE為Types.STRUCT的一行資料。也新增了對SQLXML和ROWID這些新的資料型別的支援。

(原文:Clarified to indicate that if the database supports SQL distinct types, then getTypeInfo() will return a single row with a TYPE_NAME of DISTINCT and a DATA_TYPE of Types.DISTINCT. If the database supports SQL structured types, then getTypeInfo() will return a single row with a TYPE_NAME of STRUCT and a DATA_TYPE of Types.STRUCT. Support has also been added for the new data types SQLXML and ROWID.)

 

  • getCrossReference --- 得到給定外來鍵表中外來鍵列的描述資訊,從父表返回的列數應該匹配外來鍵列數。它們按照FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME 和 KEY_SEQ排序。

(原文:Clarified that the method retrieves a description of the foreign key columns in the given foreign key table that reference the primary key or the unique constraint columns of the parent table (could be the same or a different table). The number of columns returned from the parent table must match the number of columns that make up the foreign key. They are ordered by FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, and KEY_SEQ.)

 

  • getColumns --- 闡明當COLUMN_DEF的返回值被引號括起來時,它應該被解釋為一個字串。

(Clarified that the return value for COLUMN_DEF that the default value for the column, should be interpreted as a string when the value is enclosed in quotes.)

 

  • getProcedures --- 新增了SPECIFIC_NAME列。返回行按照PROCEDURE_SCHEM,PROCEDURE_NAME 和 SPECIFIC_NAME 排序。

 

  • getProcedureColumns --- 新增了COLUMN_DEF,SQL_DATATYPE,SQL_DATETIME_SUB,CHAR_OCTET_LENGTH,ORDINAL_POSITION,IS_NULLABLE 和 SPECIFIC_NAME列。返回行按照PROCEDURE_SCHEM,PROCEDURE_NAME 和 SPECIFIC_NAME 排序。

JDBC 4.0 類庫規範中有這些方法更新後的定義。

 

相關文章