JDBC:DatabaseMetaData

时间:2020-01-09 10:36:46  来源:igfitidea点击:

通过" 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();