DBFlute -- CursolHandler → CursorHandler {0.5.6新機能}


大量データを処理をしたい場合、普通に検索するとOutOfMemoryになります。
それは、基本S2Daoの検索は一気に全てのレコードをメモリ上にロードするからです。
頻度は低いとはいえ、1プロジェクトにつき、1回くらいはそれで困ることがあります。
主には、「SQLの結果からCSVファイルを出力する」というような場合です。
DBFluteではCursorHandlerを指定してCursorループでハンドリングできるようにしました。

# final CursorHandler handler = new CursorHandler() {
# public Object handle(java.sql.ResultSet resultSet) throws java.sql.SQLException {
# // resultSetを好きなように扱う。
# while (resultSet.next()) {
# resultSet.getXxx...
# }
# return ...;
# }
# };
# ... = dao.selectListXxx(pmb, handler);

これにて、「ResultSet直接触り」+「外だしSQL」+「Closeの必要なし」
が実現できます。

しかし、java.sql.ResultSetを直接触るのはちょっと嫌です。
全然タイプセーフではないからです。そこで...

#
# --#SimpleBookGenre#
# --+cursor+
#
# select book.BOOK_ID
# , book.BOOK_NAME
# , book.GENRE_CODE
# ...
#

これでSql2Entityを実行すると先ほどのプログラム以下のようになります。

# final SimpleBookGenreCursorHandler handler = new SimpleBookGenreCursorHandler() {
# public Object fetchCursor(SimpleBookGenreCursor cursor) throws java.sql.SQLException {
# // cursorを経由してResultSetからタイプセーフに値を取得できる。
# while (cursor.next()) {
# BigDecimal bookId = cursor.getBookId();
# String bookName = cursor.getBookName();
# String genreCode = cursor.getGenreCode();
# ...
# }
# return null; // 別に戻り値が不要ならnullでよい。
# }
# };
# dao.selectListXxx(pmb, handler); // Daoメソッドの戻り値もvoidでよい。

これにて、「ResultSet直接触り」+「タイプセーフ」+「外だしSQL」+「Closeの必要なし」
が実現できます。
これはまさしく「自動生成(DBFlute)ならでは」と言えるでしょう。

これで10万件のレコードを一気に処理したいという場合でも
JDBCを直接使う」とかやんなくてもOKです。