Java中用PreparedStatement配合ResultSetMetaData动态解析的核心是不依赖固定实体类,运行时获取字段名、类型、数量等元信息,再逐行读取并映射为Map或List等通用结构,适用于通用DAO、导出工具等场景。

Java 中用 PreparedStatement 配合 ResultSetMetaData 动态解析,核心是**不依赖固定实体类,运行时获取字段名、类型、数量等元信息,再逐行读取并映射为通用结构(如 Map 或 List
获取 ResultSetMetaData 并遍历列信息
执行 PreparedStatement.executeQuery() 后,从 ResultSet 获取 ResultSetMetaData,它提供每列的名称、SQL 类型、Java 类型等关键信息:
- 调用
rs.getMetaData().getColumnCount()得到列数 - 用
getColumnLabel(i)获取别名(推荐,兼容AS),或getColumnName(i)获取原始列名 - 用
getColumnTypeName(i)看数据库类型(如VARCHAR),getColumnClassName(i)看 JDBC 驱动映射的 Java 类(如java.lang.String) -
isNullable(i)和isCurrency(i)可用于后续空值/格式处理
动态构建每行数据(Map)
遍历结果集时,对每一行循环所有列,用列名作 key,ResultSet.getObject(i) 作 value 构建 Map:
-
rs.getObject(i)能自动适配多数类型(NULL返回null,TIMESTAMP返回Timestamp) - 避免硬编码
getString/getInt,否则需按类型分支判断,易出错且难维护 - 示例:若 SQL 是
"SELECT name AS user_name, age FROM users",则 Map 的 key 是"user_name"和"age"
处理特殊类型和 NULL 值
虽然 getObject 大部分情况够用,但遇到 BLOB、CLOB、DATE 或驱动返回 oracle.sql.TIMESTAMP 等非标准类型时需额外转换:
立即学习“Java免费学习笔记(深入)”;
- 先用
getColumnType(i)拿到java.sql.Types常量(如Types.BLOB) - 对
Types.BLOB,用rs.getBlob(i).getBytes();对Types.DATE,可用rs.getDate(i)再转LocalDate - 判断是否为 NULL 推荐用
rs.wasNull()(调用getObject或其他 getter 后立即检查)
封装成可复用的方法
把上述逻辑抽成工具方法,输入 PreparedStatement,输出 List<map object>></map>:
- 方法内负责
executeQuery、getMetaData、列信息缓存(如列名列表)、逐行读取与 Map 构建 - 可选增加泛型参数或回调接口,支持自定义类型转换(如统一把
java.util.Date转成Instant) - 注意关闭资源:用 try-with-resources 包裹
PreparedStatement和ResultSet


















