ResultSetMetaData 可在运行时动态获取查询结果的结构信息,支持列数、列名(含别名)、SQL类型、数据库类型及映射的Java类名,推荐用 getColumnClassName() 获取类型映射,需在 rs.next() 后调用 getMetaData()。

使用 ResultSetMetaData 可以在运行时动态获取查询结果的结构信息,无需硬编码列名或类型,特别适合通用 DAO、数据导出、动态表格渲染等场景。
获取 ResultSetMetaData 对象
执行查询后,从 ResultSet 中调用 getMetaData() 方法获得元数据对象:
注意:必须在 ResultSet 有数据(即调用过 next())之后才能安全使用元数据,但通常只需获取一次,放在循环前即可。
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM user");ResultSetMetaData metaData = rs.getMetaData();
获取列数和列名
通过元数据可获知结果集有多少列,并逐个读取每列的名称(含别名):
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
int columnCount = metaData.getColumnCount();-
String columnName = metaData.getColumnName(i);—— 返回 SQL 中定义的列名或别名 -
String columnLabel = metaData.getColumnLabel(i);—— 更推荐,返回AS指定的别名,若无别名则同列名
例如:SELECT u.id AS uid, u.name FROM user u,getColumnLabel(1) 返回 "uid",而 getColumnName(1) 可能返回 "id"(取决于驱动实现)。
获取列类型和 Java 类型映射
元数据提供数据库类型信息,也可推断常用 Java 类型:
-
int sqlType = metaData.getColumnType(i);—— 返回java.sql.Types中的常量,如Types.VARCHAR、Types.INTEGER -
String typeName = metaData.getColumnTypeName(i);—— 返回数据库特有类型名,如"VARCHAR2"(Oracle)、"TEXT"(MySQL) -
String className = metaData.getColumnClassName(i);—— 直接返回 JDBC 驱动建议的 Java 类全限定名,如"java.lang.String"、"java.lang.Integer"
推荐优先使用 getColumnClassName(),它已由驱动适配好类型映射,比手动根据 getColumnType() 判断更可靠。
遍历列信息的典型用法
结合列数循环,构建字段名-值映射或生成表头:
if (rs.next()) {
ResultSetMetaData md = rs.getMetaData();
int colCount = md.getColumnCount();
for (int i = 1; i <= colCount; i++) {
String label = md.getColumnLabel(i);
String javaType = md.getColumnClassName(i);
Object value = rs.getObject(i);
System.out.printf("%s(%s) = %s%n", label, javaType, value);
}
}
注意列索引从 1 开始,不是 0;getObject(i) 能自动适配对应 Java 类型,配合元数据可做到完全泛型化处理。

















