ひがやすを技術ブログ

電通国際情報サービスのプログラマ

JDBCどっちのコードショー

このRowCallbackHandlerはResultSetを扱うためのもので,結果セットの行ごとにJdbcTemplateからコールバックされる,次のメソッドを持っています.
void processRow(ResultSet rs)
引数でResultSetを渡されますが,そのnext()を呼び出すのはJdbcTemplateの役割です.
ところで,このメソッドはvoidなんですね.行を処理した結果はどうするの?
このあたり,ちょっとイマイチな感じなのですが,実はRowCallbackHandlerの実装クラスが
ResultReader
というinterfaceもimplementsしていれば,そのメソッドである
List getResults()
を通じてListを返すことができます.ということは,自分でListを用意するのですね.てっきり,行ごとのインスタンスを返せば,それをJdbcTemplateがListに加えてくれるのだと思っちゃいました.無念だ.

Springまたもやいまいち。
S2はどうなっているかというと同じようなRowHandlerというのがあります。
インターフェースは


public Object createRowValue(
ResultSet rs,
PropertyType[] propertyTypes)
throws SQLException;
もちろんオブジェクトを返します。id:koichikさん。
そう考えるのが普通な気がするけどなぁ。
SpringのRowCallbackHandlerってメタデータ(PropertyType)なしで、
どうやってオブジェクトを作るのだろう。
もしかして、結果セット(SELECT文)の種類ごとにハードコーディング
するってことなのか。
あとはListResultSetHandlerが

public Object handle(ResultSet rs, DatabaseMetaData dbMetaData)
throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
PropertyType[] propertyTypes =
getPropertyHandler().createPropertyTypes(rsmd);
List list = new ArrayList();
while (rs.next()) {
list.add(getRowHandler().createRowValue(rs, propertyTypes));
}
return list;
}
のようになっているので、RowHandlerを取り替えれば任意のリストを返せます。
MapListResultHandlerはつぎのようにコンストラクタで
PropertyHandlerとRowHandlerを設定しているだけです。

public class MapListResultSetHandler extends ListResultSetHandler {
public MapListResultSetHandler() {
setPropertyHandler(new ResultSetMetaDataPropertyHandler());
setRowHandler(new MapRowHandler());
}
}
S2とSpringでどっちのコードショーしても面白いかも。
あなたはどっち。