如何在关闭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);
}
我该如何解决这个问题?
我要返回结果集的原因是我可以重新使用 executeData方法对于任何对象数据
您无法读取结果前close
的ResultSet
& Connection
对象数据库,而不是你需要的close
ResultSet
& Connection
对象在调用方法,即每当你正在读取结果完成。
,我认为你的目标是避免了样板代码,并从数据库中填充对象(如您的C_Person
或C_Car
,等等。),那么我强烈建议,你需要去的ORM(映射一个Java对象与关系表)框架如Hibernate。
您有终于块在这里。无论何时发生异常,它都会执行,因此在从方法返回结果集之前,它会关闭连接。
结果集不应该存储在try/catch之外吗? –
有“CachedRowSet的”,正是为: https://docs.oracle.com/javase/6/docs/api/javax/sql/rowset/CachedRowSet.html
看看弹簧JDBC来的一个很好的方式,使周围的JDBC瘦包装的例子。它使用回调来填充Resultset中的对象。像休眠这样的ORM功能强大,但学习曲线陡峭。 –