ResultSet转化为List以及JavaBean实例源码,数据库查询获取数据之后的相关处理。
把ResultSet结果集转换为List,每条记录信息保存为Map放到List中,方法如下:
public static List<Map<String, Object>> toMap(ResultSet rs) throws SQLException {
if(rs == null) return null;
List<Map<String, Object>> result = new ArrayList<Map<String,Object>>();
//取得结果集结构信息,字段类型、数量
ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount();
Map<String, Object> map = new HashMap<String, Object>();
while(rs.next()) {
map = new HashMap<String, Object>();
//把一条数据库表记录转为map存储
for (int i = 1; i <= cols; i++) {
map.put(rsmd.getColumnName(i), rs.getObject(i));
}
result.add(map);
}
return result;
}
将ResultSet结果集中的一条记录转换为JavaBean
public static <T> T toBean(ResultSet rs, Class<T> type) throws Exception {
if(rs == null) return null;
//获取class中定义的属性
Field[] fields = type.getDeclaredFields();
//创建java对象
T obj = type.newInstance();
//循环对象属性值
for(Field f : fields) {
Object value = rs.getObject(f.getName());
if(value != null) {
//oracle中number类型对应java中的BigDecimal类型。
if(value.getClass() == BigDecimal.class && (f.getType() == Integer.class || f.getType() == int.class)) {
value = ((BigDecimal)value).intValue();
}
f.setAccessible(true);
f.set(obj, value);
}
}
return obj;
}
上面的方法相对简单,org.apache.commons.dbutils实现了比较好的BasicRowProcessor.toBean(ResultSet rs, Class<T> type)方法,改进有如下:
1、动态添加(属性–>列)映射关系,例如:javaBean中的desc属性对应resultSet中的t_desc列。
2、属性默认值填充,创建javaBean,假如在resultSet没有找到对应的值,可设置默认值。
3、dbutils使用的是内省方式,并非直接使用反射。