Javaから一般的なリレーショナルデータベース(以下、データベースと呼称)にアクセスするには、以下に示すようにjava.sqlパッケージのConnection、Statement、ResultSetを使うのが基本です。
InitialContext init = new InitialContext( ); |
この基本的な方法では、以下のような問題があります。
このように、従来の方法ではコードの記述量が多く、記述方法にも気を使わなければいけませんでした。この問題は、Jakarta DbUtilsを使うことで解決できます。
DbUtilsはJakarta Commonsプロジェクトの産物であり、Javaからデータベースにアクセスするためのツールです。DbUtilsはデータベースアクセスの基本的なAPIであるConnection、Statement、ResultSetを使用することによるコード記述の煩雑性を緩和し、かつ高速に動作することを目的として開発されました。DbUtilsはこれら基本的なAPIの代わりとして使用します。
DbUtilsの使い方の基本は以下のとおりです。QueryRunner#queryの戻り値がデータベース検索の結果になりますが、QueryRunner#queryの第2引数として渡すResultSetHandlerの内容により、QueryRunner#queryの戻り値の型が変化します。
import org.apache.commons.dbutils.QueryRunner; |
DbUtilsのダウンロードはhttp://jakarta.apache.org/commons/dbutils/downloads.htmlからできます。執筆時点の最新版はバージョン1.0です。ダウンロードしたzipファイルを展開して出てきたcommons-dbutils-1.0.jarをクラスパスに通すことでjavaコードから使用可能になります。
DbUtilsでは、QueryRunner#queryの第2引数として、org.apache.commons.dbutils.handlersパッケージのBeanHandlerまたはBeanListHandlerのインスタンスを渡すことで、データベースを検索した結果セットを自動的にJavaBeansにマッピングすることができます。これを利用するとさらにコードの記述量を削減することができます。BeanHandlerとBeanListHandlerの違いは以下のとおりです。
DbUtilsのクラス | 機能 | QueryRunner#query の戻り値の型 | |
---|---|---|---|
BeanHandler | 最初のレコードのデータを、コンストラクタの引数に渡したJavaBeansクラスのインスタンスに格納し取得する | コンストラクタの引数に渡したJavaBeansクラス | |
BeanListHandler | BeansHandlerの全レコード対応版。全レコードについてBeanHandlerを適用し、得られた全JavaBeansインスタンスをListとして取得する | List(個々の要素はコンストラクタの引数に渡したJavaBeansクラスのインスタンス) | |
BeanHandlerまたはBeanListHandlerを用いて、データベースを検索した結果セットをJavaBeansにマッピングするには、データベースのテーブルのカラムとJavaBeansのプロパティとの間で型と名前(大文字小文字は同一視される)をそろえておく必要があります。例えばItems.sqlで定義されるテーブルITEMSに格納されるデータをJavaBeansにマッピングするには、MyBean.javaのようにJavaBeansを定義します。
CREATE TABLE ITEMS |
package mybean; |
BeanListHandlerを使用して、データベースにアクセスし、テーブルITEMSに格納されている全データをMyBean.javaにより定義されるJavaBeansとして取得するjspの例をBeanListHandlerSample.jspとして示します。なお、前述したMyBean.javaのクラスファイルを含んだjarファイルと、DbUtilsのcommons-dbutils-1.0.jarがtomcat上のアプリケーションから参照可能になっており、DataSourceはJNDI名「java:comp/env/jdbc/TestDB」で取得できるものとします。tomcatでJNDI名を設定する方法は、「JNDI活用でデータソース管理を一元化する」を参照してください。
BeanListHandlerSample.jspを見ると分かるように、わずか3行で目的の処理ができています。終了処理もInitialContextだけであり、コードもすっきりしているのが分かります。
<%@ page contentType="text/html; charset=Windows-31J" |
Copyright © ITmedia, Inc. All Rights Reserved.