數(shù)據(jù)庫(kù)元數(shù)據(jù)
第7章 數(shù)據(jù)庫(kù)元數(shù)據(jù)
JDBC驅(qū)動(dòng)通過(guò)實(shí)現(xiàn)DatabaseMetaData接口來(lái)提供底層數(shù)據(jù)源的信息。DatabaseMetaData接口主要被應(yīng)用服務(wù)器和工具使用,以此決定怎樣跟給定數(shù)據(jù)源交互。普通應(yīng)用也可以通過(guò)DatabaseMetaData的方法得到數(shù)據(jù)源的信息,但這不常用。
DatabaseMetaData?接口有超過(guò)150個(gè)方法,根據(jù)提供的信息可以分為以下幾類:
- 提供數(shù)據(jù)源的一般信息
- 判斷數(shù)據(jù)源是否支持某種特性或具有某種能力
- 數(shù)據(jù)源的限制
- 數(shù)據(jù)源包含哪些SQL對(duì)象以及這些對(duì)象的屬性
- 數(shù)據(jù)源提供的事務(wù)支持
DatabaseMetaData?接口還有超過(guò)40個(gè)字段,這些字段用于DatabaseMetaData中各種方法的常量返回值。
這一章粗略介紹一下DatabaseMetaData接口,通過(guò)舉例子對(duì)元數(shù)據(jù)方法進(jìn)行分類,同時(shí)介紹一些新的方法。詳細(xì)介紹請(qǐng)參考JDBC 4.0 類庫(kù)規(guī)范
JDBC中的ResultSetMetaData接口將在第15章“結(jié)果集”介紹。
7.1 創(chuàng)建DatabaseMetaData對(duì)象
DatabaseMetaData?對(duì)象由Connection的getMetaData方法創(chuàng)建,然后我們可以利用它來(lái)動(dòng)態(tài)獲取底層數(shù)據(jù)源的信息。代碼示例 7-1 創(chuàng)建了一個(gè)DatabaseMetaData對(duì)象,并用它來(lái)查看表名允許的最大字符數(shù)。
// con是一個(gè)Connection對(duì)象
DatabaseMetaData dbmd = con.getMetadata();
int maxLen = dbmd.getMaxTableNameLength();
代碼示例 7-1 創(chuàng)建和使用DatabaseMetaData對(duì)象
7.2 獲取一般信息
DatabaseMetaData?中有一類方法用于獲取底層數(shù)據(jù)源的一般信息,或者它的一些實(shí)現(xiàn)細(xì)節(jié)。這類方法有:
- getURL
- getUserName
- getDatabaseProductVersion, getDriverMajorVersion 和 getDriverMinorVersion
- getSchemaTerm, getCatalogTerm 和 getProcedureTerm
- nullsAreSortedHigh 和 nullsAreSortedLow
- usesLocalFiles 和 usesLocalFilePerTable
- getSQLKeywords
7.3 查看支持的特性
大量DatabaseMetaData方法可以用來(lái)判斷驅(qū)動(dòng)或底層數(shù)據(jù)源是否支持某個(gè)特性或特性集。還有一些方法可以告知提供支持的級(jí)別。
判斷是否支持某個(gè)特性的方法如下:
- supportsAlterTableWithDropColumn
- supportsBatchUpdates
- supportsTableCorrelationNames
- supportsPositionedDelete
- supportsFullOuterJoins
- supportsStoredProcedures
- supportsMixedCaseQuotedIdentifiers
查看特性支持級(jí)別的方法:
- supportsANSI92EntryLevelSQL
- supportsCoreSQLGrammar
7.4 數(shù)據(jù)源限制
另一組方法提供數(shù)據(jù)源對(duì)操作的限制信息,如下:
- getMaxRowSize
- getMaxStatementLength
- getMaxTablesInSelect
- getMaxConnections
- getMaxCharLiteralLength
- getMaxColumnsInTable
方法返回一個(gè)整型的限制數(shù)。0表示沒(méi)有限制或未知限制。
7.5 SQL對(duì)象及其屬性
DatabaseMetaData?中有一組方法提供組成數(shù)據(jù)源之SQL對(duì)象的信息。這組方法也包含獲取SQL對(duì)象屬性的方法。方法的返回值是一個(gè)ResultSet,ResultSet的每一行代表一個(gè)特定對(duì)象。例如,getUDTs方法返回的ResultSet里每一行都是數(shù)據(jù)源里定義的一個(gè)UDT(user-defined type)。這類方法主要有:
- getSchemas
- getCatalogs
- getTables
- getPrimaryKeys
- getProcedures
- getProcedureColumns
- getUDTs
7.6 事務(wù)支持
一小部分方法提供數(shù)據(jù)源所支持事務(wù)的語(yǔ)義信息。這類方法主要有:
- supportsMultipleTransactions
- getDefaultTransactionIsolation
7.7 新增方法
JDBC 4.0 類庫(kù)在DatabaseMetaData中引入了下列新方法:
- getSchemas --- 重載了已有的getSchemas方法,使用目錄和模式作為參數(shù)。
- supportsStoredFunctionsUsingCallSyntax --- 判斷用戶或廠商自定義的方法是否可以使用存儲(chǔ)過(guò)程轉(zhuǎn)義語(yǔ)法來(lái)調(diào)用。
- autoCommitFailureClosesAllResultSets --- 當(dāng)autoCommit設(shè)置為true時(shí),標(biāo)示程序錯(cuò)誤拋出SQLException后是否所有打開(kāi)著的結(jié)果集(包括持久(holdable)結(jié)果集)都被關(guān)閉。
- providesQueryObjectGenerator --- 標(biāo)示JDBC驅(qū)動(dòng)是否提供自己的QueryObjectGenerator實(shí)現(xiàn)。
- getClientInfoProperties --- 獲取驅(qū)動(dòng)支持的客戶端屬性列表。
這些方法的完整定義見(jiàn)JDBC 4.0 類庫(kù)規(guī)范(javadoc)。
7.8 經(jīng)過(guò)修改的方法
JDBC 4.0 類庫(kù)修改了DatabaseMetaData中下列方法的定義:
- getTypeInfo --- 如果數(shù)據(jù)庫(kù)支持SQL distinct類型,則getTypeInfo()返回一行TYPE_NAME字段為DISTINCT,DATA_TYPE字段為Types.DISTINCT的數(shù)據(jù)。如果數(shù)據(jù)庫(kù)支持SQL結(jié)構(gòu)化類型,則getTypeInfo()返回一行TYPE_NAME字段為STRUCT、DATA_TYPE為Types.STRUCT的數(shù)據(jù)。也添加了對(duì)SQLXML和ROWID這些新的數(shù)據(jù)類型的支持。
(原文: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 --- 得到給定外鍵表中外鍵列的描述信息,從父表返回的列數(shù)應(yīng)該匹配外鍵列數(shù)。它們按照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 --- 闡明當(dāng)COLUMN_DEF的返回值被引號(hào)括起來(lái)時(shí),它應(yīng)該被解釋為一個(gè)字符串。
(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 類庫(kù)規(guī)范中有這些方法更新后的定義。
翻譯進(jìn)度請(qǐng)參考http://www.pgsqldb.org/twiki/bin/view/PgSQL/JDBC4說(shuō)明書
版權(quán)所有 羅明