java:commons_dbutils
Jakarta Commons DBUtils
DBUtilsはJDBCのヘルパーライブラリ。ResultSetを各種Javaオブジェクトに変換したりコネクションクローズ等の定型処理を代わりに実行する。Objectの永続化はできないのでO/Rマッパではない。ちょっとしたDAOクラスを自作する場合などに便利なクラス。
リフレクションやBean操作クラスを多用しておりソースコードを読むと勉強になる。小さいライブラリで非常に奇麗なソースなので読みやすい。
それなりの規模の案件では素直にS2DaoやHibernateあたりのO/Rマッパーを使っておいた方が良い。
以下バージョン1.0 - 1.1が対象
使い方
言うまでもないが、ダウンロードして実行時にクラスパスにjarを含めること。
ResultSetのデータをBeanにマッピングする。Beanにはテーブルに対応するプロパティを用意する。例えばhogeという文字列型カラムがあるならば、hogeというString型プロパティをBeanに作る。
// 作成したいBean Class bean = AtomEntry.class; // dsはデータソース、DBCPを利用するかJ2EEならJNDI等で QueryRunner qr = new QueryRunner(ds); // 1レコード検索 String sql = "SELET id, title, link, published, summary FROM atom_table WHERE id = '1'"; ResultSetHandler rsh = new BeanHandler(bean); AtomEntry obj = (AtomEntry)qr.query(sql, rsh); // 全件検索 String sql = "SELECT id, title, link, published, summary FROM atom_table"; ResultSetHandler rsh = new BeanListHandler(bean); List obj = (List)qr.query(sql, rsh); // パラメータ付き検索、PreparedStatementのバインド変数が利用可能 String sql = "SELECT id, title, link, published, summary FROM atom_table WHERE title = ? AND published > ?"; Object[] param = {"http://web.paulownia.jp/hoge", new java.sql.Timestamp(1163521000000L)}; ResultSetHandler rsh = new BeanListHandler(bean, param); List obj = (List)qr.query(sql, rsh);
コネクションやステートメントのクローズ処理はDBUtilsが行うので何もしなくてよい。
トランザクションを使う
update、queryメソッドの最初の引数にConnectionを渡すことができる。クエリ実行後に自動クローズされなくなるので好きな位置でConnection#rollback、Connection#commitを呼ぶ。コネクションプーリングしている場合はcommitしないといつまでもデータベースに反映されないので注意すること。
ResultSetHandlerいろいろ
ScalarHandler | 最初の1レコードの最初のカラムを返す。count(*)などに使用 |
ArrayHandler | 最初の1レコードを左のカラムから順番に配列に格納して返す。 |
ArrayListHandler | ArrayHandlerの複数レコード対応版、ArrayHandlerで取得できる配列をレコード数だけ格納したリストを返す。 |
MapHandler | 最初の1レコードをカラム名をキーとしたマップに格納して返す。 |
MapListHandler | MapHandlerの複数レコード対応版、MapHandlerで取得されるマップがレコード数分だけ格納されたリストを返す。 |
BeanHandler | カラム名(エイリアスでも可)をプロパティ名としてselect結果の最初のレコードをBeanに格納して返す。 |
BeanListHandler | BeanHandlerの複数レコード版。 |
ResultSetHandlerを自作してみる
1番目のカラムをマップのキー、2番目のカラムをjava.util.URL型の値に変換してマップの値に格納して返すResultSetHandlerを自作してみた。
public class URLMappingHandler implements ResultSetHandler{ public Object handle(ResultSet rs) throws SQLException { Map map = new java.util.LinkedHashMap(); while (rs.next()) { try { map.put(rs.getString(1), new URL(rs.getString(2))); } catch (MalformedURLException e) { throw new SQLException(e); } } return map; } }
java/commons_dbutils.txt · 最終更新: 2007/10/18 14:37 by 127.0.0.1