2

私の目標は、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た。

4

1 に答える 1

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;
}
于 2013-03-08T21:08:49.927 に答える