ユーザ用ツール

サイト用ツール


java:commons_dbutils

Jakarta Commons DBUtils

DBUtilsJDBCのヘルパーライブラリ。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レコードを左のカラムから順番に配列に格納して返す。
ArrayListHandlerArrayHandlerの複数レコード対応版、ArrayHandlerで取得できる配列をレコード数だけ格納したリストを返す。
MapHandler最初の1レコードをカラム名をキーとしたマップに格納して返す。
MapListHandlerMapHandlerの複数レコード対応版、MapHandlerで取得されるマップがレコード数分だけ格納されたリストを返す。
BeanHandlerカラム名(エイリアスでも可)をプロパティ名としてselect結果の最初のレコードをBeanに格納して返す。
BeanListHandlerBeanHandlerの複数レコード版。

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