楼主自己已经找到原因了,你把Statement对象关闭了,那么他所有的ResultSet也会被关闭

解决方案 »

  1.   

    你不要返回ResultSet,你返回成list,就是把ResultSet里面的数据都放到list里面,这样就可以了
      

  2.   

    看你写的这个意思是不是不想要总复制粘贴这一套东西?
    因为rs必须在关闭之前把里面携带的值copy出去。
    你可以试试把一个model类的class传进去,然后用反射,将rs查出来的字段匹配model里面的属性名称将rs查出来的每条记录变成传入的class参数的一个对象,然后返回这类对象的集合。
    就像hibernate的HibernateTemplate里面的查询方法一样。
      

  3.   


    上面说了你错误;同时这样通用的方法很难写,一般都是采用ORM框架了;对于一个简单的查询,也还是可以尝试下,可以使用反射实现;比如:(没有测试,随意写的,还需你更多的完善)public static <T> List<T> selectData(
    String sql, 
    Class<T> clz,                               //你的实体Bean类
    HashMap<String, String> columnsToFieldsMap  //数据库表列名到bean字段名的映射
    ){ 
    ResultSet rs = null;
    Statement st = null;
    Connection conn = ConnectionPool.getConnection();

    List<T> results = new ArrayList<T>();

    try {
    st = conn.createStatement();
    rs = st.executeQuery(sql);
    BeanInfo beanInfo = Introspector.getBeanInfo(clz);
    PropertyDescriptor[] beanDesArr = beanInfo.getPropertyDescriptors();
    ResultSetMetaData rsm = rs.getMetaData();
    int size = rsm.getColumnCount();

    while(rs.next()){
    T obj = clz.newInstance();
    for(int i = 1; i <= size; i++ ){
    String columnName = rsm.getColumnName(i);
    for(PropertyDescriptor prop: beanDesArr){
    if(prop.getName().equals(columnsToFieldsMap.get(columnName))){
    prop.getWriteMethod().invoke(obj, rs.getObject(i));
    }
    }
    }

    results.add(obj);
    }
    return results;

    } catch (Exception e) {
    e.printStackTrace();
    }finally{
    try{
    if(st!=null){
    st.close();
    ConnectionPool.closeConnection(conn);
    }
    }catch(SQLException e){
    e.printStackTrace();
    }
    }

    return results;
    }
      

  4.   

    你不要返回ResultSet,你返回成list,就是把ResultSet里面的数据都放到list里面,这样就可以了有理,我怎么想了半天都没想到这个,郁闷