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中使用的是内省方式,而不是直接使用反射。