Java中ResultSetMetaData支持运行时动态获取SQL查询结果结构信息,包括列数、列名(推荐getColumnLabel)、JDBC类型、数据库原生类型及对应Java类名,适用于通用查询工具等场景。

Java 中通过 ResultSetMetaData 可以在运行时动态获取 SQL 查询结果的结构信息,无需硬编码列名或类型,特别适合通用查询工具、ORM 映射或动态报表场景。
获取 ResultSetMetaData 实例
执行查询后,从 ResultSet 对象中调用 getMetaData() 方法即可获得元数据对象:
注意:必须在 ResultSet 有数据(即 next() 返回 true)之后才能安全使用,但实际只要 ResultSet 创建完成,即使未移动游标,也能获取元数据。
ResultSet rs = stmt.executeQuery("SELECT id, name, created_at FROM user");ResultSetMetaData meta = rs.getMetaData();
获取列数与列名
通过元数据可获知结果集有多少列,并逐个读取每列的名称(区分大小写取决于数据库和驱动):
立即学习“Java免费学习笔记(深入)”;
-
int columnCount = meta.getColumnCount();—— 获取总列数 -
String columnName = meta.getColumnName(i);—— 获取第i列的原始列名(如"id") -
String columnLabel = meta.getColumnLabel(i);—— 获取列别名(SQL 中用AS定义的,更推荐使用)
建议优先用 getColumnLabel(),它反映 SQL 中最终呈现的列标识,对含别名或函数表达式的查询更准确。
获取列数据类型与 Java 类型映射
元数据提供 JDBC 类型编号和对应名称,也可推断常用 Java 类型:
-
int jdbcType = meta.getColumnType(i);—— 返回java.sql.Types中定义的常量(如Types.INTEGER、Types.VARCHAR) -
String typeName = meta.getColumnTypeName(i);—— 返回数据库原生类型名(如"INT"、"VARCHAR2",因数据库而异) -
String className = meta.getColumnClassName(i);—— 返回该列推荐的 Java 类型全限定名(如"java.lang.Integer"、"java.lang.String"),JDBC 4.0+ 支持
例如:getColumnClassName(1) 对 MySQL 的 INT 列可能返回 "java.lang.Integer";对 TIMESTAMP 可能返回 "java.time.LocalDateTime"(取决于驱动版本和配置)。
遍历所有列并打印结构信息
一个典型实用示例:
ResultSetMetaData meta = rs.getMetaData();
int colCount = meta.getColumnCount();
for (int i = 1; i <= colCount; i++) {
String label = meta.getColumnLabel(i);
int type = meta.getColumnType(i);
String typeName = meta.getColumnTypeName(i);
String className = meta.getColumnClassName(i);
System.out.printf("列[%d]: %s | JDBC类型=%d(%s) | Java类=%s%n",
i, label, type, typeName, className);
}
输出类似:列[1]: id | JDBC类型=4(INTEGER) | Java类=java.lang.Integer


















