我的目标是将所有与我的MySql数据库的交互集中在一个类中(例如SqlUtils)。我基本上想保持对ResultSet或类似类的访问,即使在连接关闭后也是如此。以下方法不起作用,因为在我的业务方法接收到ResultSet之后,会抛出一个异常,因为底层连接已经关闭。我想强调的是,打开和关闭与数据库的连接必须在getResultSet()中进行。
public ResultSet getResultSet(String sql) {
try (Connection conn = getConnection();){
return conn.createStatement().executeQuery(sql);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}我现在想做的事情是这样的:
public List<ResultHolder> getResultSet(String sql) {
List<ResultHolder> list = new LinkedList<>();
try (Connection conn = getConnection();
ResultSet res = conn.createStatement().executeQuery(sql);) {
while(res.next()) {
list.add(res.convertToResultHolder());
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}有没有我需要的类,我把它表示为ResultHolder。
发布于 2013-03-09 05:08:50
如果您希望在连接关闭后仍能访问所有结果集数据,那么我建议使用以下方法:
public List<Map<String, Object>> getResultSet(String sql) {
// this list will hold all the data returned from resultset
List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
try (Connection conn = getConnection();
ResultSet rs = conn.createStatement().executeQuery(sql);) {
while(rs.next()) {
// this map corresponds to each row of the resultset
// key: column-name, value: column-value
Map<String, Object> row = new LinkedHashMap<String, Object>();
// populate each row using resultset's Meta data
ResultSetMetaData meta = rs.getMetaData();
for (int i=1; i<=meta.getColumnCount(); i++)
row.put(meta.getColumnName(i), rs.getObject(i));
rows.add(row);
}
} catch (Exception e) {
e.printStackTrace();
}
return rows;
}https://stackoverflow.com/questions/15303085
复制相似问题