通过连接数据库, select 语句会得到 ResultSet . 然后正常情况下 会取出ResultSet 中的值进行各种操作. 操作完成之后 ResultSet 进行close.  再连接close.
现在,我想让返回的 ResultSet 继续存在.不知道有没有什么好的办法.  如果是用C#写的话 他会返回 dataset  而dataset和数据库连接之类的操作本身是不绑定的,所以 关闭连接后不会关闭这个 dataset
但是现在java里关闭Connection, PreparedStatement 这2个对象之后 ResultSet  就默认被关闭了.

解决方案 »

  1.   

    最常见的方法就是将ResultSet里面的数据缓存到ArrayList 这样的集合类当中,然后需要的时候通过集合类操作获得对应数据
    JDBC规范里面也有不依赖数据库连接的接口是RowSet极其子接口,这个用的比较少,RowSet的子接口具体实现相对麻烦一些
      

  2.   

    用ARRAYLIST肯定不行.我需要一个 结构,像ResultSet就够我用了.
    我需要的是 ResultSet 断开之后我依然能够 getInt("列");因为我不关心 db 访问层操作.  仅仅需要一个类似ResultSet结构的对象被返回回来就行.比如:
    //我在任何想执行select的地方都只需要掉这个方法获得ResultSet 但是ResultSet会被db访问层给关闭,所以我需要一个替代品. 而替代品肯定不能是Arraylist这样简单结构的东西
    public ResultSet getResult(String sql, String dbName);
      

  3.   

    ArrayList可以存储对象,你的getInt()这些数据可以被存储为JavaBean对象的属性。如果真的不想用这个,那么就用RowSet接口吧,用行集记录。给你贴个Demo
    package jdbc.basic;import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;import javax.sql.rowset.CachedRowSet;import com.sun.rowset.CachedRowSetImpl;/**
     * 这个例子用来学习JDBC规范当中的行集RowSet
     * 只能能够证明,如果连接关闭了,仍然可以通过RowSet获取到之前存储的数据
     * @author GaoYong
     *
     */
    public class CustomerCon {
    public static Connection con=null;
    public static Statement stmt=null;
    public static ResultSet rs=null;

    /**
     * @param args
     */
    public static void main(String[] args)throws Exception {
    // TODO Auto-generated method stub
    String driver="com.mysql.jdbc.Driver";
    String url="jdbc:mysql://localhost:3306/TEST?useUnicode=true&characterEncoding=UTF-8";
    Class.forName(driver);
    con=DriverManager.getConnection(url,"root","root");
    stmt=con.createStatement();

    String sql="select * from customer";
    rs=stmt.executeQuery(sql);
    System.out.println("-------如下利用ResultSet输出------");
    while(rs.next()){
    int id=rs.getInt("id");
    String name=rs.getString("name");
    int age=rs.getInt("age");
    System.out.println(id+","+name+","+age);
    }
    System.out.println("------ResultSet输出结束-----------");
    CachedRowSet rowset=new CachedRowSetImpl();

    //利用rs的数据填充到rowset并将游标调整到初始状态
    rowset.populate(rs,1);

    rs.close();
    stmt.close();
    con.close();

    System.out.println("-------如下利用RowSet输出------");
    while(rowset.next()){
    int id=rowset.getInt("id");
    String name=rowset.getString("name");
    int age=rowset.getInt("age");
    System.out.println(id+","+name+","+age);
    }
    System.out.println("------RowSet输出结束-----------");
    rowset.close();
    }}
      

  4.   

    for example
    ResultSetMetaData rsm = your_resultset.getMetaData();
    List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
    while (your_resultset.next());
        Map<String, Object> map = new TreeMap<String, Object>();
        for (int i=0; i<rsm.getColumnCount(); i++) {
            map.put(rsm.getColumnName(i), rs.getObject(i));
        }
        result.add(map);
    }
      

  5.   

    把ResultSet中的数据通过while(rs.next())循环放到一个JavaBean中,接着放到ArrayList中,或直接放到ArrayList中,再把ArrayList放到session中,就可以在任何界面通过session.getAttribute("list")
    来访问ResultSet中查出的元素了
      

  6.   

    java有 CachedRowSet
    -------------------谢谢,这个就够了.  其他缓存方法,都是自实现的 , 没有系统提供的直接.还是谢谢了.