Java中通过JDBC的DatabaseMetaData接口可跨数据库获取元数据:包括数据库名称与版本、驱动信息、表列表、字段结构(类型/长度/空值性/默认值)、主键/外键/索引等,且无需手写SQL查询系统表。

Java 中通过 JDBC 的 DatabaseMetaData 接口,可以方便地获取数据库版本、表结构、字段类型等元数据信息,无需写 SQL 查询系统表,兼容性好且跨数据库。
获取数据库版本和基本信息
DatabaseMetaData 提供了多个方法直接读取数据库厂商、版本、JDBC 驱动信息。关键方法包括:
-
getDatabaseProductName():返回数据库产品名称,如 "MySQL"、"PostgreSQL"、"Oracle" -
getDatabaseProductVersion():返回数据库主版本号,如 "8.0.33"(MySQL)、"15.3"(PostgreSQL) -
getDriverName()和getDriverVersion():获取 JDBC 驱动名称与版本 -
getURL():返回当前连接的 JDBC URL,可用于判断数据库类型或配置
示例代码片段:
Connection conn = DriverManager.getConnection(url, user, pwd);
DatabaseMetaData meta = conn.getMetaData();
System.out.println("DB Name: " + meta.getDatabaseProductName());
System.out.println("DB Version: " + meta.getDatabaseProductVersion());
System.out.println("Driver: " + meta.getDriverName() + " v" + meta.getDriverVersion());
查询指定数据库中的所有表
使用 getTables() 方法可列出指定 schema 或 catalog 下的表(含视图)。参数顺序固定,需注意 null 值含义:
立即学习“Java免费学习笔记(深入)”;
- 第1个参数(catalog):通常为
null(MySQL 不支持 catalog,PostgreSQL/Oracle 可填数据库名) - 第2个参数(schemaPattern):模式名,MySQL 填数据库名(如 "mydb"),PostgreSQL 填 "public",可用通配符 "%"
- 第3个参数(tableNamePattern):表名匹配,如 "user%" 或 "%" 表示全部
- 第4个参数(types):字符串数组,如
new String[]{"TABLE"}(过滤掉 VIEW)
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
ResultSet tables = meta.getTables(null, "mydb", "%", new String[]{"TABLE"});
while (tables.next()) {
System.out.println("Table: " + tables.getString("TABLE_NAME"));
}
获取某张表的字段结构(列信息)
调用 getColumns(catalog, schema, table, column) 获取列定义。常用参数组合:
- catalog:一般传
null - schema:MySQL 填数据库名,PostgreSQL 填 schema 名(如 "public")
- table:表名,必填,支持通配符
- column:列名,
null或 "%" 表示查所有字段
结果集中关键字段有:
-
COLUMN_NAME:字段名 -
TYPE_NAME:数据库类型(如 "VARCHAR"、"BIGINT") -
COLUMN_SIZE:长度(对字符串是最大字符数,对数字是精度) -
DECIMAL_DIGITS:小数位数(适用于 DECIMAL/FLOAT) -
IS_NULLABLE:是否允许 NULL("YES"/"NO") -
COLUMN_DEF:默认值(可能为 null 或带引号的字符串,如 "'0'")
示例:
ResultSet cols = meta.getColumns(null, "mydb", "users", null);
while (cols.next()) {
String name = cols.getString("COLUMN_NAME");
String type = cols.getString("TYPE_NAME");
int size = cols.getInt("COLUMN_SIZE");
String nullable = cols.getString("IS_NULLABLE");
System.out.printf("%s %s(%d) %s%n", name, type, size, nullable);
}
获取主键、外键与索引信息
除基础结构外,DatabaseMetaData 还支持获取约束关系:
-
getPrimaryKeys(catalog, schema, table):返回主键列名、顺序、列名 -
getImportedKeys(catalog, schema, table):查该表作为“子表”所引用的外键(即它依赖哪些主键) -
getExportedKeys(catalog, schema, table):查该表作为“父表”被哪些外键引用 -
getIndexInfo(catalog, schema, table, unique, approximate):获取索引详情(含是否唯一、列顺序等)
例如获取主键:
ResultSet pks = meta.getPrimaryKeys(null, "mydb", "users");
while (pks.next()) {
System.out.println("PK Column: " + pks.getString("COLUMN_NAME")
+ " (seq=" + pks.getShort("KEY_SEQ") + ")");
}
不复杂但容易忽略:不同数据库对 catalog/schema 的理解差异较大,建议先用 getSchemas() 或 getCatalogs() 查清当前环境支持的命名空间结构,再构造 getTables / getColumns 参数。

















