3

どのようにPreparedStatement.executeQuery機能しますか?データベースから結果をフェッチし、それらをループしますか?または、最初の結果をフェッチし、record.nextで次の行へのSQLクエリを続行しますか?

ResultSet record = statement.executeQuery("select * from users");
    while (record.next()) {
    //do something
}

ありがとうございました

4

2 に答える 2

9

ドキュメントから:

声明

public ResultSet executeQuery(String sql) throws SQLException

指定されたSQLステートメントを実行します。これにより、単一のResultSetオブジェクトが返されます。

ResultSet

データベースの結果セットを表すデータのテーブル。通常、データベースを照会するステートメントを実行することによって生成されます。

public boolean next() throws SQLException

カーソルを現在の位置から1行下に移動します。ResultSetカーソルは、最初は最初の行の前に配置されます。次にメソッドを最初に呼び出すと、最初の行が現在の行になります。2番目の呼び出しは、2番目の行を現在の行にします。

現在の行に対して入力ストリームが開いている場合、nextメソッドを呼び出すと、暗黙的にその行が閉じられます。ResultSetオブジェクトの警告チェーンは、新しい行が読み取られるとクリアされます。


表現として、これはステートメントが1回実行され、繰り返されるとその実行の結果に対して繰り返されることを意味します。


ただし、データベースからの結果がどのように処理されるかは、実際には実装によって異なります。対照的に、MSSQL、MYSQLの2つのデータベースを参照します。

MSSQL

結果の処理方法を正確にコメントするMSSQLドライバーのドキュメントは、次の場所にあります

結果セットには、クライアント側とサーバー側の2種類があります。

クライアント側の結果セットは、結果がクライアントプロセスメモリに収まる場合に使用されます。これらの結果は最速のパフォーマンスを提供し、SQLServer用のMicrosoftJDBCDriverによってデータベースから完全に読み取られます。これらの結果セットは、サーバー側カーソルの作成のオーバーヘッドを発生させることにより、データベースに追加の負荷をかけることはありません。ただし、これらのタイプの結果セットは更新できません。

サーバー側の結果セットは、結果がクライアントプロセスメモリに収まらない場合、または結果セットを更新できる場合に使用できます。このタイプの結果セットでは、JDBCドライバーはサーバー側カーソルを作成し、ユーザーがスクロールすると結果セットの行を透過的にフェッチします。

MySQL

ここで読むことができるJDBCインターフェースのMySql実装:

デフォルトでは、ResultSetは完全に取得され、メモリに保存されます。ほとんどの場合、これが最も効率的な操作方法であり、MySQLネットワークプロトコルの設計により、実装が容易です。多数の行または大きな値を持つResultSetを使用していて、必要なメモリ用にJVMにヒープスペースを割り当てることができない場合は、一度に1行ずつ結果をストリーミングするようにドライバーに指示できます。

于 2012-07-27T19:06:47.883 に答える
2

あなたはそれを正しくやっています。クエリから結果全体をフェッチし、それらをループします。
内部ポインタまたはカーソルは、最初は最初の行のから開始されるため、呼び出すと最初の行record.next()に移動します。

http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSet.html#next%28%29

于 2012-07-27T19:03:39.420 に答える