每次查询都要
getConnection();
stat_ = conn_.createStatement();
rs_ = stat_.executeQuery(sql);我想把这几句放在一个函数中,比如query(sql),这样每次查询只要一个函数就可以了。但是这样做在返回值的时候遇到了问题。如果函数返回ResultSet,那么rs.close必须要到query(sql)运行完之后。(因为如果在query里close了,那么返回的rs就没有用了。而query完要求我们记得close总是不太适合的。如果返回某个集合(如ArrayList),那么,在query里必须牵涉到表的字段(这样显然不行)。那么怎么办呢?有没有什么办法把ResultSet的结果拷贝到某个集合中,使得即使ResultSet被关闭了,结果也能被查询呢?

解决方案 »

  1.   

    用游标咯 放到一个procedure礼貌 
    stat_.executeQuery(procedure);
      

  2.   

    apache 有个 dbutil 的工具包,可以传入一个 connection + sql + sql 参数, 返回 bean object /bean list/ array list.应该比较符合你的要求。它会帮你 close 那个 statement/prepared statement/ result set. connection 是你外面传入,就需要你自己 close. 对于 web 应用,我的习惯是把 connection 放在 thread local 变量中,在 filter 中 close connection. 这样代码比较简单。
      

  3.   

    好麻烦,不就为了方便,提高可读性嘛,还是用ORM框架得了
      

  4.   

    去拿Metadata先/**
       *  Get columns as <code>String[]</code> from <code>ResultSetMetaData[]</code>.
       */  
      public String[] getColumns(ResultSet rs)
      {
         String[] columns = null; 
         try
         {
             ResultSetMetaData meta = rs.getMetaData();
             int columnCount = meta.getColumnCount();
             
             columns = new String[columnCount];      
             for (int i = 0; i < columnCount; i++) 
             {
                 columns[i] = meta.getColumnName(i + 1).toLowerCase();
             }
         }
         catch(SQLException e)
         {
             log.error("SQLException caught. " + e);
         }
         return columns;
      }然后当然就简单了