Java中获取表结构的核心是通过Connection获取DatabaseMetaData,再调用getColumns()、getTables()、getPrimaryKeys()等方法查询元数据;需确保连接有效、驱动就绪,并适配MySQL/Oracle/PostgreSQL等数据库在catalog、schema、大小写及权限上的差异。

Java 中用 JDBC 获取表结构信息,核心是通过 Connection 获取 DatabaseMetaData,再调用其方法查询表、列、主键等元数据。关键在于连接要正常、驱动已加载、SQL 方言适配(不同数据库返回字段略有差异)。
1. 建立连接并获取 DatabaseMetaData
必须先获得有效的 Connection 对象,才能调用 getMetaData():
- 确保 JDBC URL、用户名、密码正确,且对应数据库驱动(如 MySQL 用
mysql-connector-java)已在 classpath 中 - 推荐使用 try-with-resources 自动关闭资源,避免连接泄漏
示例代码:
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "123456";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
DatabaseMetaData metaData = conn.getMetaData();
// 后续操作基于 metaData
}
2. 查询指定表的列信息(最常用)
用 getColumns() 获取字段名、类型、是否为空、默认值等详细结构:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 参数顺序为:
catalog(库名,MySQL 通常传null或数据库名)、schemaPattern(模式,MySQL 填null)、tableNamePattern(支持通配符,如"user"或"%")、columnNamePattern(列名模式,一般填"%") - 返回的
ResultSet每行代表一个字段,关键列包括:COLUMN_NAME、DATA_TYPE(int 类型码)、TYPE_NAME(如 "VARCHAR")、IS_NULLABLE、COLUMN_DEF(默认值)
示例:
ResultSet rs = metaData.getColumns(null, null, "user", "%");
while (rs.next()) {
String colName = rs.getString("COLUMN_NAME");
int sqlType = rs.getInt("DATA_TYPE");
String typeName = rs.getString("TYPE_NAME");
String nullable = rs.getString("IS_NULLABLE");
String defVal = rs.getString("COLUMN_DEF");
System.out.printf("%s | %s | %s | %s | %s%n",
colName, typeName, sqlType, nullable, defVal);
}
3. 获取主键、外键、索引等关联结构
补充表级元数据,便于生成 ORM 映射或校验完整性:
-
getPrimaryKeys(null, null, "user"):返回主键字段名和所在列序号(KEY_SEQ) -
getImportedKeys(null, null, "user"):查该表作为“被引用方”的外键(即哪些表引用了本表主键) -
getIndexInfo(null, null, "user", false, true):获取索引信息,false表示不返回统计信息,true表示包含唯一索引
4. 注意不同数据库的兼容性细节
虽然 JDBC 规范统一,但实际行为因数据库而异:
- MySQL:catalog 即数据库名,schema 无意义,常传
null;getTables()中tableTypes传new String[]{"TABLE"}才能查到普通表 - PostgreSQL:schema 默认是
"public",catalog 一般为null,需显式指定 schemaPattern 如"public" - Oracle:catalog 为空,schema 是用户名(大写),需注意大小写和权限
建议先用 getDatabaseProductName() 和 getDatabaseProductVersion() 判断环境,再调整参数。

















