Java JDBC通过DatabaseMetaData的getTables()、getColumns()、getPrimaryKeys()和getImportedKeys()等方法获取表名、字段、主键及外键信息,需正确设置catalog、schema、tableTypes等参数,并注意数据库差异与资源释放。

Java JDBC 中通过 DatabaseMetaData 获取表结构信息,核心是调用其提供的标准方法(如 getTables()、getColumns() 等),配合正确参数过滤目标表和字段,再遍历 ResultSet 提取元数据。
获取数据库中所有表名及基本信息
使用 getTables() 方法可列出当前数据库中符合条件的表。关键在于传入正确的 catalog、schema 和表类型参数:
- catalog 通常为
null或数据库名(MySQL 不支持 catalog,填null即可) - schema 可填
"%"表示通配,或具体 schema 名(如 MySQL 填数据库名,PostgreSQL 填"public") - tableTypes 建议指定
new String[]{"TABLE"},避免视图、系统表等干扰
示例代码片段:
DatabaseMetaData metaData = connection.getMetaData();
ResultSet tables = metaData.getTables(null, "%", "%", new String[]{"TABLE"});
while (tables.next()) {
String tableName = tables.getString("TABLE_NAME");
String tableType = tables.getString("TABLE_TYPE");
String remarks = tables.getString("REMARKS"); // 表注释(部分驱动支持)
System.out.printf("表名: %s, 类型: %s, 注释: %s%n", tableName, tableType, remarks);
}
获取指定表的所有列定义
调用 getColumns() 可获取某张表的字段详情。参数顺序为:catalog、schemaPattern、tableNamePattern、columnNamePattern:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 前三个参数常用
null、"%"、具体表名(如"user") - columnNamePattern 填
"%"获取全部列 - 返回结果集中关键字段包括:
COLUMN_NAME、TYPE_NAME、COLUMN_SIZE、NULLABLE、REMARKS(列注释)、COLUMN_DEF(默认值)
注意:NULLABLE 返回的是整型(DatabaseMetaData.columnNoNulls 等常量),需转换判断是否允许为空。
获取主键与外键约束信息
表的完整性约束需分别查询:
- 主键:用
getPrimaryKeys(catalog, schema, table),结果含COLUMN_NAME和KEY_SEQ(序号,复合主键时有用) - 外键:用
getImportedKeys(catalog, schema, table)获取本表作为“被引用方”的外键(即本表字段引用其他表),或getExportedKeys()获取本表作为“引用方”的外键(即本表字段被其他表引用) - 结果集中重要字段有:
PKTABLE_NAME(主键所在表)、PKCOLUMN_NAME(主键列)、FKCOLUMN_NAME(外键列)、UPDATE_RULE/DELETE_RULE(级联行为)
注意事项与常见问题
不同数据库驱动对元数据的支持程度不一:
- MySQL Connector/J 对
REMARKS(注释)支持较好,但需在连接 URL 中添加&useInformationSchema=true(新版驱动默认启用) - Oracle 需注意 schema 名区分大小写,且常需指定用户名作为 schema
- 字段类型映射依赖驱动实现,
TYPE_NAME是数据库原生类型名(如VARCHAR2、TINYINT),不是 Java 类型 - 务必关闭
ResultSet和Statement,避免资源泄漏;元数据查询本身不走 SQL 引擎,性能开销较小但仍有连接占用


















