在 JDBC 開發中,頻繁需要將 ResultSet 查詢結果映射為實體對象列表。本文提供一個基於反射與 JSON 庫的通用轉換方法,適合快速開發與原型驗證。
import net.sf.json.JSONArray;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.*;
public static <T> List<T> convertToList(ResultSet rs, Class<T> clazz) throws SQLException {
List<Map<String, Object>> rowList = new ArrayList<>();
ResultSetMetaData meta = rs.getMetaData();
int columnCount = meta.getColumnCount();
while (rs.next()) {
Map<String, Object> row = new HashMap<>();
for (int i = 1; i <= columnCount; i++) {
row.put(meta.getColumnName(i), rs.getObject(i));
}
rowList.add(row);
}
// 利用 JSON 庫實現 Map → Bean 的自動映射
JSONArray jsonArray = JSONArray.fromObject(rowList);
return JSONArray.toList(jsonArray, clazz);
}
ResultSet,利用 ResultSetMetaData 獲取列名與值,構建 List<Map<String,Object>>。JSONArray.toList(jsonArray, clazz) 反序列化為目標實體列表(依賴 net.sf.json-lib 庫)。<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
| 優點 | 缺點 |
|---|---|
| 代碼極簡,零配置映射 | 依賴第三方 JSON 庫,增加體積 |
| 支持巢狀對象、集合等複雜類型 | 性能較原生反射/RowMapper 稍低 |
| 字段名不匹配時自動忽略,容錯性好 | 日期/時間類型需註冊 JsonConfig 處理 |
生產環境高性能場景建議使用 Spring JdbcTemplate 的 BeanPropertyRowMapper 或 MyBatis 等成熟 ORM 框架。本方法適合中小項目、工具類遷移、測試代碼快寫。