Spring-JDBCのgetResultSet
-
03-07-2019 - |
質問
JDBCのSpringのサポートを使用しています。 JdbcTemplateを使用したい(またはSimpleJdbcTemplate)を使用して、クエリを実行し、ResultSetのインスタンスとして結果を取得します。
これを達成する唯一の方法は、以下を使用することです:
String sql = "select * from....";
SqlRowSet results = jdbcTemplate.queryForRowSet(sql);
((ResultSetWrappingSqlRowSet) results).getResultSet();
このアプローチの明らかな欠点は、SqlRowSetの実装タイプについて(キャストすることで)仮定する必要があることですが、もっと良い方法はありますか?
背景情報...
結果をBeanのコレクションではなくResultSetとして取得する理由は、結果が表示のためにJasperレポートに直接渡されるためです。つまり、Java BeanはResultSetの各行を一時的に保存する以外の目的には使用されず、可能な限りすべてのJasperレポートに対してそのようなBeanを作成しないようにしたいと思います。
乾杯、ドン
解決
クエリを実行して結果を取得するだけであれば、プレーンなjdbcを使用して結果セットを取得してみませんか?これを行うのにスプリングは必要ないことに注意してください。
Connection c = ...
c.prepareCall("select ...").getResultSet();
さらに、オブジェクトをDTOとして使用することで利点が得られます。データアクセスやレポートツールが変更された場合でも、DTOクラスを変更する必要はありません(jdbcの代わりにxqueryを使用するか、jasperの代わりにapache-poiを使用するとしましょう。
他のヒント
JdbcTemplateコールバック(ResultSetExtractorなど)内でJasperを呼び出すか、ストレートJDBCを使用してResultSetをJasperに渡すことができます。どちらの方法でも、Jasperを呼び出すと、データベースへの接続はレポートが完了するまでアクティブのままです。