JDBC 執行查詢後,將 ResultSet 行資料映射為 Java 物件(POJO),主要有兩種方式:
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;
}
jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class)) 自動駝峰匹配。BeanPropertyRowMapper 或 MyBatis。核心思想:**欄位名與屬性名約定優於配置**,配合工具自動化,消除重複映射程式碼。