2013-03-08 3 views
2

Моя цель - централизовать все взаимодействия с моей базой MySql в одном классе (например, SqlUtils). В основном я хочу поддерживать доступ к ResultSet или аналогичному классу даже после закрытия соединения. Следующий способ не работает, поскольку после того, как мой бизнес-метод получает ResultSet, возникает исключение, потому что базовое соединение уже закрыто. Я хочу подчеркнуть, что открытие и закрытие соединения с базой данных должно происходить внутри getResultSet().Сохраните результаты ResultSet в списке

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.

ответ

2

Если вы хотите, чтобы иметь доступ ко всем данным Resultset даже после того, как соединение будет закрыто, то я хотел бы предложить следующее:

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; 
} 
+0

Wow! Именно то, что мне нужно. Благодаря! – mossaab

+0

Добро пожаловать, рад, что это сработало для вас. – anubhava

Смежные вопросы