gpt4 book ai didi

java - 关闭后获取结果

转载 作者:行者123 更新时间:2023-11-30 08:04:29 25 4
gpt4 key购买 nike

我在 java 中使用 sqlite 驱动程序。如您所知,典型的顺序是

Create Statement
Execute Statement
Get ResultSet

Process Results

close ResultSet
close statement

问题是以上所有都在一个方法中,我希望调用者获取结果并处理它。然而,由于结果是在方法结束时返回的,到那时语句和结果集已关闭。

我能想到的唯一解决方法是让 RS 和 Stmnt 成为类变量并让调用者关闭它们,但如果它是多线程环境,这会带来问题。

实现我想要的目标的推荐方法是什么?谢谢

public ResultSet runQuery(String sql) {

try {

st = conn.createStatement();
rs = st.executeQuery(sql);

rs.close();
st.close()

} catch (SQLException ex) {
Logger.getLogger(DatabaseHelper.class.getName()).log(Level.SEVERE, null, ex);
}

return rs
}

来自另一个文件

private void displayListOfEmployee(){
String sql = "Select * from employee";
ResultSet rs = DB.getInstance().runQuery(sql);
while(rs.next()!=null){
System.out.println(.....); // display value of column
}
}

最佳答案

您可以添加 Consumer<ResultSet>方法参数:

public void query(String query, Consumer<ResultSet> consumer) {
// Create Statement
try (Statement stmt = ...) {
// Execute Statement
ResultSet rs = ...
consumer.accept(rs);
}
}

有了这个,调用者可以从结果集中提取它的数据,你可以保证资源是关闭的。

一种变体是使用 Function参数并计算返回值:

public <T> T query(String query, Function<ResultSet,T> function) {
// Create Statement
try (Statement stmt = ...) {
// Execute Statement
ResultSet rs = ...
return function.apply(rs);
}
}

Consumer.acceptFunction.apply不允许抛出已检查的异常您可能想要定义类似的功能接口(interface)以允许已检查的异常并在该方法中使用它。

更新:

您的示例将转换为:

private void displayListOfEmployee(){
String sql = "Select * from employee";
DB.getInstance().runQuery(sql, rs -> {
while (rs.next())
System.out.println(.....); // display value of column
});
}

关于java - 关闭后获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35602875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com