如何在关闭Java中的连接之前返回ResultSet

问题描述:

我想只写1个execute方法,并在需要时重新使用它,而不用重写整个事物。以下是我返回ResultSet的方法。如何在关闭Java中的连接之前返回ResultSet

public ResultSet executeSelect() { 
    Connection con = null; 
    PreparedStatement prepared = null; 
    ResultSet rs = null; 
    try { 
     con = C_DB.getConnection(); 
     prepared = con.prepareStatement(this.getQuery()); 

     if(!this.midQuery.equals("")) { 
      int i = 1; 
      for (String val: this.values) { 
       prepared.setString(i, val); 
       i++; 
      } 
     } 

     rs = prepared.executeQuery(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (prepared != null) { 
       prepared.close(); 
      } 
      if (con != null) { 
       con.close(); 
      } 
     } catch(SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
    return rs; 
} 

问题是的ExecuteSelect()执行,连接,PreparedStatement和ResultSet中的数据返回前关闭之后,所以我得到这个错误java.sql.SQLException: Operation not allowed after ResultSet closed

我希望返回的ResultSet是我的原因,再利用任何对象数据的executeData方法。例如:

C_Query q = new C_Query(dataSearch,"SELECT * FROM people ", " ORDER BY id DESC"); 
ResultSet rs = q.executeSelect() 

ObservableList<C_Person> peopleData = FXCollections.observableArrayList(); 
while(rs.next()){ 
    C_Person person = new C_Person(); 
    person.setFirstName(rs.getString("firstName")); 
    person.setLastName(rs.getString("lastName")); 
    peopleData.add(person); 
} 

C_Query q = new C_Query(dataSearch,"SELECT * FROM cars", " ORDER BY id DESC"); 
ResultSet rs = q.executeSelect() 

ObservableList<C_Car> CarData = FXCollections.observableArrayList(); 
while(rs.next()){ 
    C_Car car = new C_Car(); 
    car.type(rs.getString("type")); 
    car.brand(rs.getString("brand")); 
    CarData.add(car); 
} 

我该如何解决这个问题?

+0

看看弹簧JDBC来的一个很好的方式,使周围的JDBC瘦包装的例子。它使用回调来填充Resultset中的对象。像休眠这样的ORM功能强大,但学习曲线陡峭。 –

我要返回结果集的原因是我可以重新使用 executeData方法对于任何对象数据

您无法读取结果前closeResultSet & Connection对象数据库,而不是你需要的closeResultSet & Connection对象在调用方法,即每当你正在读取结果完成。

,我认为你的目标是避免了样板代码,并从数据库中填充对象(如您的C_PersonC_Car,等等。),那么我强烈建议,你需要去的ORM(映射一个Java对象与关系表)框架如Hibernate

您有终于块在这里。无论何时发生异常,它都会执行,因此在从方法返回结果集之前,它会关闭连接。

+0

结果集不应该存储在try/catch之外吗? –