Javaライブラリ(Commons)DBUtils Beanを使った検索とか | Hello, Stupid World!

Hello, Stupid World!

いろいろとメモ代わりに書いていきます。

前回はDbUtilsを使った検索でしたが検索結果はObject[]を要素としたArrayList
に格納されていました。
それはQueryRunnerのqueryメソッドを呼ぶ際に引数にArrayListHandlerを渡している為です。
これを直接Beanに入れて返してもらうようにするにはBeanListHandlerというのを
使います。

使い方はこんな感じです。

ArrayList<User> users = (ArrayList<User>)qr.query(con, "select * from User;", new BeanListHandler(User.class));
for (User user : users) {
 String result = Integer.toString(user.getId());
 String result2 = user.getName();
 System.out.println("Result = " + result + ", " + result2);
}

BeanListHandlerをqueryの引数とする事でUserというBeanを要素とするArrayListが返ってくるようになりました。
このBeanListHandlerを使うことで、よく行う検索結果をBeanに入れる処理を
省略できます。
Bean内のプロパティ名は検索テーブルの列名と合わせておく必要があります。

検索対象が一列と分かっている場合にはBeanListHandlerではなく
BeanHandlerを使えば、そのままBeanに入って帰ってきます。

他にもqueryメソッドに渡す引数のResultSetHandlerを実装したクラスには
以下のようなものがあります。
・MapHandler・・・列名をキーにしたMapを返すもの
・MapListHandler・・・MapHandlerをリストにしたもの
・ScalarHandler・・・指定した列番号(列名)の値を返すもの。count * とかで使うと良いです。

また、自分でResultSetHandlerを実装したクラスを作れば
より自由度の高いものが作成できます。

ResultSetHandler<Object[]> rsh = new ResultSetHandler<Object[]>(){
 @Override
 public Object[] handle(ResultSet resultset) throws SQLException {
 if (!resultset.next()) {
  return null;
 }

 ResultSetMetaData meta = resultset.getMetaData(); //テーブル情報取得
 int cols = meta.getColumnCount(); //カラム数取得
 Object[] result = new Object[cols];

 for (int i = 0; i < cols; i++) {
  result[i] = resultset.getObject(i + 1); //値取得(indexは1~)
 }
 if (!resultset.next()) {
  return null;
 }
 for (int i = 0; i < cols; i++) {
  result[i] = result[i].toString() + "-" + resultset.getObject(i + 1).toString();
 }
 return result;
}

こんな感じの匿名クラス作ってみました。
1行目と2行目の内容を-で繋いで返すだけ。
試しに作っただけで実用性は無いです。
見てのとおり、handleメソッドを用意する必要があります。
handleメソッドは引数としてResultSetがわたってくるので、そこから値を取って
returnしてあげれば良いです。

使い方はqueryメソッドの引数に渡します。
qr.query(con, "select * from User;", rsh);
JSON形式にしてStringで返すのとか作ったら便利そうと思ったり。