JDBC:DatabaseMetaData
通过" java.sql.DatabaseMetaData"接口,我们可以获得有关已连接数据库的元数据。例如,我们可以查看数据库中定义了哪些表,每个表具有哪些列,是否支持给定函数等。
" DatabaseMetaData"接口包含很多方法,本教程中不会涵盖所有方法。我们应该签出JavaDoc。本文内容将足以使我们对如何使用它有一种感觉。
获取DatabaseMetaData实例
我们可以从"连接"中获取" DatabaseMetaData"对象,如下所示:
DatabaseMetaData databaseMetaData = connection.getMetaData();
一旦获得了这个" DatabaseMetaData"实例,就可以在其上调用方法以获得有关数据库的元数据。
数据库产品名称和版本
我们可以获取数据库产品名称和版本,如下所示:
int majorVersion = databaseMetaData.getDatabaseMajorVersion(); int minorVersion = databaseMetaData.getDatabaseMinorVersion(); String productName = databaseMetaData.getDatabaseProductName(); String productVersion = databaseMetaData.getDatabaseProductVersion();
如果我们已经确切地知道应用程序要针对哪个数据库运行,则可能不需要此数据库。但是,如果我们要开发的产品需要能够与许多不同的数据库产品一起运行,则此信息在确定其支持的数据库特定函数,所支持的SQL等方面非常方便。
数据库驱动程序版本
我们可以获取所使用的JDBC驱动程序的驱动程序版本,如下所示:
int driverMajorVersion = databaseMetaData.getDriverMajorVersion(); int driverMinorVersion = databaseMetaData.getDriverMinorVersion();
同样,如果应用程序是针对非常特定的数据库运行的,那么它的信息可能并不那么丰富。但是,对于需要能够针对许多不同的数据库产品和版本运行的应用程序,了解使用的驱动程序的确切版本可能是一个优势。例如,某个驱动程序版本可能包含应用程序需要解决的错误。或者,驱动程序可能缺少应用程序随后需要解决的函数。
列表表
我们可以通过DatabaseMetaData
获取数据库中已定义表的列表。这是完成的方式:
String catalog = null; String schemaPattern = null; String tableNamePattern = null; String[] types = null; ResultSet result = databaseMetaData.getTables( catalog, schemaPattern, tableNamePattern, types ); while(result.next()) { String tableName = result.getString(3); }
首先,我们调用getTables()方法,并向其传递4个全为空的参数。这些参数可以帮助限制在" ResultSet"中返回的表的数量。但是,由于我希望返回所有表,因此我在所有这些参数中都传递了null。有关参数的更多特定详细信息,请参见JavaDoc。
从getTables()方法返回的结果集包含与4个给定参数(均为空)匹配的表名的列表。这个"结果集"包含10列,每列包含有关给定表的信息。索引为3的列包含表名称本身。检查JavaDoc以获取有关其余各列的更多详细信息。
列出表中的列
我们也可以通过DatabaseMetaData
获取表的列。方法如下:
String catalog = null; String schemaPattern = null; String tableNamePattern = "my_table"; String columnNamePattern = null; ResultSet result = databaseMetaData.getColumns( catalog, schemaPattern, tableNamePattern, columnNamePattern); while(result.next()){ String columnName = result.getString(4); int columnType = result.getInt(5); }
首先,我们要调用getColumns()
方法,并传递4个参数。其中,只有tableNamePattern
设置为非空值。将其设置为要获取其列的表的名称。
getColumns()方法返回的结果集包含给定表的列列表。索引为4的列包含列名,索引为5的列包含列类型。列类型是一个整数,它与在java.sql.Types中找到的类型常量之一匹配。
要获取有关获取表的列信息的更多详细信息,请查看JavaDoc。
表的主键
也可以获取表的主键。我们这样做,就像这样:
String catalog = null; String schema = null; String tableName = "my_table"; ResultSet result = databaseMetaData.getPrimaryKeys( catalog, schema, tableName); while(result.next()){ String columnName = result.getString(4); }
首先,我们调用" getPrimaryKeys()"方法,并向其传递3个参数。在这个例子中,只有tableName
是非空的。
getPrimaryKeys()方法返回的结果集包含组成给定表主键的列的列表。索引为4的列包含列名。
一个主键可能包含多个列。这样的密钥称为复合密钥。如果表包含复合键,则" ResultSet"将包含多行。复合键中的每一列一行。
支持的函数
" DatabaseMetaData"对象还包含有关JDBC驱动程序和数据库支持的函数的信息。这些函数中的许多函数由我们可以调用的方法表示,该方法将根据是否支持给定函数而返回true或者false。
我不会在这里介绍所有与函数支持相关的方法。我仅举几个例子。有关函数支持方法及其含义的完整列表,请查阅JavaDoc。
databaseMetaData.supportsGetGeneratedKeys(); databaseMetaData.supportsGroupBy(); databaseMetaData.supportsOuterJoins();