数据库元数据
第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 类库规范中有这些方法更新后的定义。
翻译进度请参考http://www.pgsqldb.org/twiki/bin/view/PgSQL/JDBC4说明书
版权所有 罗明