我正在使用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
}
}
答案 0 :(得分:2)
您可以在方法中添加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.accept
和Function.apply
不允许抛出已检查的异常,因此您可能需要定义类似的功能接口,这些接口允许检查异常并在该方法中使用它。
更新:
您的示例将转换为:
private void displayListOfEmployee(){
String sql = "Select * from employee";
DB.getInstance().runQuery(sql, rs -> {
while (rs.next())
System.out.println(.....); // display value of column
});
}
答案 1 :(得分:1)
一种可能的解决方案是使用CachedRowSet
,Nginx failed (13: Permission denied) when start rails with unicorn填充ResultSet
,但可以比Statement/Connection
生成的ResultSet
更长。
请注意,这会将整个ResultSet
读入内存。