首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JDBC ResultSet 映射到 Java 物件:反射自動映射或手動 Setter

     編輯:程式設計綜合問答

JDBC 執行查詢後,將 ResultSet 行資料映射為 Java 物件(POJO),主要有兩種方式:

方式一:手動 Setter(效能最佳、完全可控)

while (rs.next()) {
    User u = new User();
    u.setId(rs.getLong("id"));
    u.setName(rs.getString("name"));
    u.setEmail(rs.getString("email"));
    list.add(u);
}

方式二:反射自動映射(通用、減少樣板碼)

原理:根據欄位名與屬性名對應(或註解 @Column),透過反射呼叫 Setter 或直接設定 field。

public static  List mapResultSet(ResultSet rs, Class clazz) throws Exception {
    List list = new ArrayList<>();
    ResultSetMetaData meta = rs.getMetaData();
    int cols = meta.getColumnCount();
    while (rs.next()) {
        T obj = clazz.getDeclaredConstructor().newInstance();
        for (int i = 1; i <= cols; i++) {
            String col = meta.getColumnLabel(i);
            Object val = rs.getObject(i);
            // 簡單:欄位名 = 屬性名(駝峰轉換)
            String field = toCamelCase(col);
            try {
                java.lang.reflect.Field f = clazz.getDeclaredField(field);
                f.setAccessible(true);
                f.set(obj, val);
            } catch (NoSuchFieldException ignored) { /* 忽略不匹配欄位 */ }
        }
        list.add(obj);
    }
    return list;
}

生產級建議:使用成熟庫

  • MapStruct:編譯期生成映射碼,效能等同手寫。
  • ModelMapper / Dozer:運行期反射映射,支援複雜型別轉換。
  • Spring JdbcTemplate + BeanPropertyRowMapper:jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class)) 自動駝峰匹配。
  • MyBatis / JPA:ORM 框架內建完整映射引擎。

選擇指南

  • 簡單專案、追求極致效能 → 手寫 Setter。
  • 中型專案、Spring 生態 → BeanPropertyRowMapper 或 MyBatis。
  • 複雜映射、多資料源整合 → MapStruct + 手動微調。

核心思想:**欄位名與屬性名約定優於配置**,配合工具自動化,消除重複映射程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved