首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java ResultSet 封裝到 List 通用工具方法實現

     編輯:Java 相關知識

核心實現邏輯


public static List<Customer> queryCustomers() {
    Connection conn = new ConnectionUtil().openConnection();
    try {
        Statement stmt = conn.createStatement();
        String sql = "SELECT id, name, email FROM customertbl";
        ResultSet rs = stmt.executeQuery(sql);
        
        List<Customer> list = new ArrayList<>();
        while (rs.next()) {
            Customer c = new Customer();
            c.setId(rs.getInt("id"));           // 推薦用列名,避免 SELECT * 次序變更風險
            c.setName(rs.getString("name"));
            c.setEmail(rs.getString("email"));
            list.add(c);
        }
        return list;
    } catch (SQLException e) {
        throw new RuntimeException("查詢失敗", e);
    } finally {
        closeQuietly(conn);
    }
}

關鍵最佳實踐

維度建議理由
資源管理try-with-resources (JDK 7+) 或 finally 關閉防止連接/Statement/ResultSet 洩漏
列訪問優先 getXxx("columnName")不依賴 SELECT 列順序,重構安全
泛型List<T> 而非原始 List編譯期類型安全,消除強轉
異常處理包裝為非受檢異常或統一異常體系調用者無需捕獲 SQLException
空值處理rs.getString() 返回 null,基本類型用包裝類或判斷 wasNull()避免基本類型無法表示 NULL

通用映射工具封裝(進階)


public interface RowMapper<T> {
    T mapRow(ResultSet rs, int rowNum) throws SQLException;
}

public class BeanRowMapper<T> implements RowMapper<T> {
    private final Class<T> clazz;
    public BeanRowMapper(Class<T> clazz) { this.clazz = clazz; }
    
    public T mapRow(ResultSet rs, int rowNum) throws SQLException {
        T obj = clazz.getDeclaredConstructor().newInstance();
        ResultSetMetaData meta = rs.getMetaData();
        for (int i = 1; i <= meta.getColumnCount(); i++) {
            String col = meta.getColumnLabel(i);
            Object val = rs.getObject(i);
            // 反射設置字段或 setter,需處理類型轉換、駝峰映射
            BeanUtils.setProperty(obj, col, val);
        }
        return obj;
    }
}

// 使用
List<Customer> list = query("SELECT * FROM customertbl", new BeanRowMapper<>(Customer.class));

生產環境建議

  1. 使用成熟 ORM (MyBatis, JDBI, Spring JdbcTemplate) 替代手寫映射
  2. 連接池 (HikariCP) 管理連接生命週期
  3. 大結果集採用流式處理或分頁,避免全量載入 OOM
  4. 列名與字段名映射規約化(下劃線↔駝峰)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved