1

この問題があります。まず、Java を使用して SQL クエリを実行し、その結果を rs という resultSet() に格納します。クエリは次のとおりです。

"select ad_id, publisher_id, date, impressions, clicks from table"

次に、次を使用してすべてのデータを読み取ります。

while(rs.next()){
    (...)
}

問題は、実行しているコードが rs からのすべての情報を数回再利用する必要があることです (確率的勾配を実行しているため、いくつかの反復があります) が、新しい反復を開始すると (反復 1 から 2 へ)、rs は null になります。 SQLクエリをもう一度実行する必要があり、かなり時間がかかります...

このクエリの結果を変数に保存する「直接的な」方法はありますか? 整数値 (ad_id、publisher_id...) を保存するための 2 つの ArrayLists と日付フィールド用の 1 つを作成してから、これらのリストを反復処理することを検討しましたが、より良い簡単な方法があるのではないかと考えました。

Python では、次のようにするだけで済みます。

data = cursor.fetchall()

変数「データ」は数回使用できます。おそらくJavaにも似たようなものがあります(私はまだJavaを学んでいるので、よくわかりません)

助けてくれてありがとう

4

3 に答える 3

2

Java では、ResultSet オブジェクトは前方にのみ移動するカーソルであり、1 回だけ反復できます。したがって、結果を何度も使用したい場合は、結果を一時変数 (リストなど) に保存します。

HashMap で疎結合の配列やキーと値のペアを使用するのではなく、オブジェクト指向のアプローチに従って結果を格納することをお勧めします。

まず、データを Java オブジェクトにカプセル化する必要があります。たとえば、次のようなクラスを作成します。

public class ClickInfo {
  private int ad_id;
  private int publisher_id;
  private Date date;
  private int impressions;
  private int clicks;

  // Create getter and setter functions for the instance variabless


}

データベースを読み取り、ClickInfoオブジェクトを作成して配列に格納します。

List<ClickInfo> list = new ArrayList<ClickInfo>();

while (rs.next()) {
  ClickInfo clickInfo = new ClickInfo();
  clickInfo.setAdId(rs.getInt("ad_id"));
  ...
  list.add(clickInfo);
}

これで、リストを何度でも繰り返してデータにアクセスできます

for (ClickInfo cInfo : list)
  System.out.println(cInfo.getAdId());

EDIT : 上記の例では、結果を ArrayList に格納しています。ClickInfo オブジェクトは、アプリケーションにとって意味のある任意のデータ構造に格納できます。

于 2012-06-26T23:37:59.000 に答える
2

JDBC ResultSet がスクロール可能である場合(JDBC v2 で導入されたと思います)、ResultSetResultSet#beforeFirstからデータをコピーするのではなく、 を呼び出すことで ResultSet 自体を再利用できます。例:

Statement stmt = dbconx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                        ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
  // do stuff
}
// when finished you can reuse the ResultSet by calling beforeFirst()
rs.beforeFirst();

while (rs.next()) {
  // do more stuff
}
rs.beforeFirst();
// etc.

MySQL JDBC ドライバーで動作するようにこれを取得しました。PostgreSQLドライバーで試してみましたが、スクロール可能なResultSetをサポートしていないため、ドライバーでサポートされていない場合は、ここの他の回答で説明されているように、コレクションに結果をキャッシュする必要があります.

スクロール可能な場合は、上記のリンクのabsoluteおよびrelativeメソッドを参照して、ResultSet 内の任意のポイントにジャンプすることもできます。これは、いくつかのシナリオで役立つ場合があります。

更新:以下のコメントで Will が指摘したcreateStatementように、ResultSet をスクロール可能にするには、追加のパラメーターが必要になる場合があります。上記のコードの最初の行としてそれを追加しました。

于 2012-06-26T23:54:19.247 に答える
1

あなたの最善の選択肢は、それを多次元リストに保存する際に言ったことを正確に行うことです.

これは非常に基本的な機能です。

データ メンバー:

List<List> multiDimensionalList = new ArrayList();

関数:

while(rs.next()){
//create temporary list
List tempList = new ArrayList();
//add results to temporary list
tempList.add(rs.getInt("ad_id")); 
...
//add temporary list to your multidimensionallist
multiDimensionalList.add(tempList);
}
于 2012-06-26T23:13:53.807 に答える