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

时间:2017-04-07 17:36:10

标签: java database jdbc resultset

我想只写一个执行方法,并在需要时重复使用它而不重写整个事情。下面是我返回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);
}

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

  

我想返回ResultSet的原因是我可以重用它   任何对象数据的executeData方法

你不能close ResultSet&amp;在阅读数据库结果之前Connection个对象,而您需要close ResultSet&amp;调用方法中的Connection个对象,即每当您阅读结果时都已完成。

我认为您的目标是从数据库中避免样板代码并填充对象(如您的C_PersonC_Car等...)建议,你需要找到像Hibernate这样的ORM(将Java对象映射到关系表)框架。

答案 1 :(得分:1)

答案 2 :(得分:0)

这里有最终阻止。只要有异常,就会执行它,因此在从方法返回结果集之前,它会在任何情况下关闭连接。