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

 

posted on 2014-04-22 12:35  耿某  阅读(939)  评论(1编辑  收藏  举报

导航