我想只写一个执行方法,并在需要时重复使用它而不重写整个事情。下面是我返回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()之后,在返回数据之前关闭了Connection,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 :(得分:1)
我想返回ResultSet的原因是我可以重用它 任何对象数据的executeData方法
你不能close
ResultSet
&amp;在阅读数据库结果之前Connection
个对象,而您需要close
ResultSet
&amp;调用方法中的Connection
个对象,即每当您阅读结果时都已完成。
我认为您的目标是从数据库中避免样板代码并填充对象(如您的C_Person
或C_Car
等...)建议,你需要找到像Hibernate这样的ORM(将Java对象映射到关系表)框架。
答案 1 :(得分:1)
有'CachedRowSet',正是为此: https://docs.oracle.com/javase/6/docs/api/javax/sql/rowset/CachedRowSet.html
答案 2 :(得分:0)
这里有最终阻止。只要有异常,就会执行它,因此在从方法返回结果集之前,它会在任何情况下关闭连接。