Java プログラミング - Spring と JDBCTemplate - query、queryForList、または queryForRowSet を使用しますか?

StackOverflow https://stackoverflow.com/questions/1660756

質問

私の Java (JDK6) プロジェクトでは、 そして JDBCTテンプレート すべてのデータベース アクセスに対して。最近、Spring 2.5 から Spring 3 (RC1) にアップグレードしました。プロジェクトは次のような ORM を使用しません。 休止状態 または EJB.

大量のレコードを読み取り、それらに対して内部処理を行う必要がある場合、いくつかの (オーバーロードされた) メソッドがあるようです。query、queryForList、queryForRowSet

一方を他方の代わりに使用する基準は何でしょうか?パフォーマンスの違いはありますか?ベストプラクティス?

このトピックに関するさらなる研究のために、いくつかの外部参考文献を推奨していただけますか?

役に立ちましたか?

解決

リストとしてアクセスする標準的な方法は、 query() 他のアプローチではなく、この方法を使用します。主な違いは、 query もう 1 つの方法は、コールバック インターフェイスの 1 つ (どちらか) を実装する必要があるというものです。 RowMapper, RowCallbackHandler, 、 または ResultSetExtractor) 結果セットを処理します。

RowMapper おそらく、ほとんどの場合、これを使用することになるでしょう。これは、結果セットの各行がリスト内の 1 つのオブジェクトに対応する場合に使用されます。実装する必要があるメソッドは 1 つだけです mapRow ここで、行に入るオブジェクトのタイプを入力してそれを返します。春には、 BeanPropertyRowMapper これは、Bean プロパティ名と列名を照合することで、リスト内のオブジェクトを設定できます (注意: このクラスはパフォーマンスのためではなく利便性を目的としています)。

RowCallbackHandler 単なるリスト以上の結果が必要な場合に便利です。このアプローチを使用する場合は、戻りオブジェクトを自分で管理する必要があります。私は通常、戻り値の型としてマップ構造が必要な場合にこれを使用しています (つまり、ツリー テーブルのグループ化されたデータの場合、または主キーに基づいてカスタム キャッシュを作成している場合)。

ResultSetExtractor 結果の反復を制御する場合に使用されます。単一のメソッドを実装する extractData それは呼び出しの戻り値になります query. 。私がこれを使用するのは、他のコールバック インターフェイスを使用して構築するのがより複雑なカスタム データ構造を構築する必要がある場合のみです。

queryForList() メソッドは、これらのコールバック メソッドを実装する必要がないという点で貴重です。queryForList を使用するには 2 つの方法があります。1 つ目は、データベースの 1 つの列 (文字列のリストなど) のみをクエリする場合、クラスを引数として受け取るメソッドのバージョンを使用して、それらのクラスのオブジェクトのみのリストを自動的に取得できることです。 。

他の実装を呼び出すとき queryForList() 各列のマップである各エントリを含むリストが返されます。これは、コールバック メソッドを作成するコストを節約できるという点では優れていますが、このデータ構造を扱うのは非常に扱いにくいです。マップの値は type であるため、多くのキャストを行うことになるでしょう。 Object.

実は見たことないんですが、 queryForRowSet 野生で使用されている方法。これにより、クエリの結果全体が CachedRowSet Spring SqlRowSet によってワップされたオブジェクト。このオブジェクトを使用することには大きな欠点があると思います。 SqlRowSet アプリケーションの他の層に接続すると、それらの層をデータ アクセス実装に結合することになります。

で述べた場合を除き、これらの呼び出し間で大きなパフォーマンスの違いは見られないはずです。 BeanPropertyRowMapper. 。大規模な結果セットの複雑な操作を扱う場合は、最適化された結果セットを作成することでパフォーマンスが向上する可能性があります。 ResultSetExtractor あなたの特定のケースに合わせて。

さらに詳しく知りたい場合は、 Spring JDBC ドキュメント そしてその 私が言及したクラスの JavaDoc. 。Spring Framework に関する書籍の一部を参照することもできます。少し古いですが Spring Framework を使用した Java 開発 JDBC フレームワークの操作に関する非常に優れたセクションがあります。何よりも、各メソッドでコードをいくつか書いてみて、何が最適かを確認してください。

他のヒント

あなたは素晴らしいジェネリックの国にいるので、あなたが本当にやりたいことは、 SimpleJdbcTemplate そしてそれを使用してください query() のためのメソッド Lists オブジェクトと queryForObject() 個々のオブジェクトに対して。その理由は単純に、以前のものよりもさらに使いやすいからです。 JdbcTemplate.

上記の優れた回答にちょっとした追加が 1 つあります。queryForInt、queryForLong、queryForMap、queryForObject などの追加メソッド。単純なクエリを実行していて単一行を期待する場合には、これが良いオプションのように思えることもあります。

ただし、0 または 1 行を取得できる場合は、queryForList メソッドの方が一般的に簡単です。そうでない場合は、IncorrectResultSizeDataAccessException をキャッチする必要があります。私はそれを苦労して学びました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top