データベースの値を取得しよう
DbUtilsを使ったデータベースへのアクセスは、次のようなプログラムになります。
// 1. DataSourceを取得 Context context = new InitialContext(); DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/mysql"); // 2. QueryRunnerオブジェクトを生成 QueryRunner runner = new QueryRunner(ds); // 3. ResultSetHandlerを実装したクラスのオブジェクトを生成 ResultSetHandler<List<Object[]>> rs = new ArrayListHandler(); // 4. queryメソッドを実行 List<Object[]> book = runner.query("select id,name,price from book", rs);
簡単にプログラムの説明をします。
1. DataSourceを取得
DataSourceまたはConnectionオブジェクトを取得します。
2.QueryRunnerオブジェクトを生成
DBUtilsのQueryRunnerオブジェクトを生成します。
3.ResultSetHandlerを実装したクラスのオブジェクトを生成
結果を格納するためのオブジェクトを生成します。このとき格納するオブジェクトは使用するResultSetHandlerによって異なります。
4.QueryRunnerのqueryメソッドを実行してデータベースの値を取得
QueryRunnerのqueryメソッドは、第1引数にSQL文、第2引数にSQL文の実行結果を格納するためのオブジェクトを引数として渡します。このqueryメソッドは内部でConnectionの確立やSQL文の実行、ResultSetやConnectionのclose処理を行います。
そのため、これらの動作をプログラマ自身が書く必要がありません。そのため、コードが簡潔になっています。また、closeし忘れの心配もありません。
取得した値はListに格納されたObject配列に格納されます。JSPで表示するときは次のようになります。
<h3>ArrayListHandler</h3> <table> <thead> <tr><th>id</th><th>name</th><th>price</th></tr> </thead> <tbody> <c:forEach var="book" items="${book4}"> <tr> <td>${book[0]}</td> <td>${book[1]}</td> <td>${book[2]}</td> </tr> </c:forEach> </tbody> </table>
データベースから取得した値をテーブルで表示した例です。
![値の取得結果](http://cz-cdn.shoeisha.jp/static/images/article/7584/7584_10.gif)
DBUtilsで提供されている主なResultSetHandlerには、以下のものがあります。
クラス名 | 戻り値 | データ形式 |
---|---|---|
ScalarHandler | 列の型 | 指定した列のデータを1件取得 |
ColumnListHandler | List<Object> | 指定した列の全データをObjectのList |
ArrayHandler | Object[] | 配列 |
ArrayListHandler | List<Object[]> | 配列のList |
MapHandler | Map<String,Object> | 列名をキーとするMap |
MapListHandler | Map<String,Object> | 列名をキーとするMapのList |
BeanHandler | JavaBeans | 指定したJavaBeans |
BeanListHandler | List<JavaBeans> | 指定したJavaBeansのList |
では、ResultSetHandlerでの具体的なデータの取得方法をご紹介します。
検索結果を1つの値として取得する
データベース上の指定した列から1つの値だけを取得したいときは、ScalarHandlerを使用します。このScalarHandlerは、取得した値をJavaのObjectに変換して格納します。
変換されるObjectは、データベースの列のデータ型に応じたJavaのデータ型になります。ScalarHandlerの引数に取得したい列の名前を指定します。また、引数に列のインデックスを指定することもできます。なお、SQLの実行結果が複数ある場合でも、先頭の値のみ取得されます。
public String getScalar() throws SQLException { ResultSetHandler<Object> rs = new ScalarHandler("name"); String book = (String)runner.query( "select name from book where id =\"b001\"" , rs); return book; }