2013-03-08 70 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

如果你想訪問所有的結果集的數據連接被關閉後,那麼我建議如下:

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

哇!正是我需要的。謝謝! – mossaab 2013-03-08 21:38:25

+0

不客氣,很高興它爲你解決。 – anubhava 2013-03-08 21:45:19

相關問題