接続先のデータベースとトランザクション制御の方法が設定できましたので、いよいよデータベースに接続してみます。
ここでは、アプリケーションの内部で直接JDBC APIを利用し、オブジェクトへのマッピングも同時に行う例を紹介します。
サンプルはシンプルな小遣い帳です。表2に示すとおり、accountdbというデータベースに、実際に使った金額などが記録されるaccountテーブルと、カテゴリを登録しておくcategoryテーブルとを用意しておき、それらにデータを登録したり、またはデータを読み出したりしてみます。
フィールド | データ型 | 制約 |
---|---|---|
id | INTEGER | PRIMARY KEY |
name | VARCHAR(100) | UNIQUE |
フィールド | データ型 | 制約 |
---|---|---|
id | INTEGER | PRIMARY KEY |
id_cat | INTEGER | FOREIGN KEY REFERENCEScategory(id) |
title | VARCHAR(200) | NOT NULL |
amount | INTEGER | NOT NULL |
memo | TEXT | - |
date_create | DATE | NOT NULL |
date_modified | DATE | NOT NULL |
まずデータベースへのアクセスを担うDAO(Data Access Object)クラスとインターフェイスを作成します。メソッドはカテゴリごとの金額などを問い合わせるgetAccountByCategoryメソッド、accountテーブルにデータを追加するinsertAccountメソッド、同テーブルのデータを更新するmodifyAccountメソッドとします。実際に作成したインターフェイスをリスト1に示します。また、accountテーブルの1行文のデータを保持するクラスをリスト2に示します。
リスト1 データベースにアクセスするDAO(インターフェイス) [AccountDao.java] |
package myfirst.jdbc; |
リスト2 accountテーブルのデータを表すクラス[Account.java] |
package myfirst.jdbc; |
ではgetAccountByCategoryメソッドをどのように実装するのかを見ていきましょう。まずデータベースにアクセスするためのSQLを設定します。ここでは問い合わせ処理ですからSELECT文です。ここではPreparedStatementを利用するため、パラメータの部分を“?”としておきます。SELECT文の途中でAS句を使用しているのは、データ取得時に違うテーブルの同じフィールド名を区別できるようにするためです。
String selectSql = "SELECT a.id
AS a_id, c.id AS c_id, c.name AS c_name, a.title, a.amount, a.memo,
a.date_create, a.date_modified FROM account a, category c WHERE
a.id_cat = c.id AND a.id_cat = ? ORDER BY a.id"; |
その後、これを実行してResultSetを取得するのですが、Connectionオブジェクトは実装クラス(AccountDaoImpl.java)のコンストラクタより注入されたDataSourceから取得します。
Connection conn = ds.getConnection(); // データベース接続(DataSourceから取得) |
データベースからデータを取得したら、あとは1行分ずつAccountオブジェクトを生成して、各フィールドのデータをこのオブジェクトのプロパティに設定します。最後はこれをまとめたArrayListオブジェクトを戻り値とすれば、メソッドが完成します。
ArrayList<Account> al = new ArrayList<Account>(); // 検索されたデータを保持 |
このメソッドの実行例を以下に示します。この中でDEBUG〜とあるのは、S2から自動的に出力されたログです。カレントディレクトリに、S2で用意されているlog4j.propertiesファイルをコピーしておくと、実行時にログが表示されます。このファイルを書き換えるとログの出力先を変更することができます。
出力されたログ(getAccountByCategoryメソッドの実行例(id = 1のデータを取得) DEBUG 2005-07-01 16:12:08,208 [main] トランザクションを開始しました |
今度は、INSERTを行うinsertAccountメソッドを実装してみます。SQL文は以下のように設定しておきます。
String insertSql = "INSERT INTO account
( id_cat, title, amount, memo, date_create, date_modified ) VALUE
( ?, ?, ?, ?, CURDATE(), CURDATE() )"; |
PreparedStatementオブジェクトを用意するところまでは先ほどのメソッドと同じです。その後、各パラメータにAccountオブジェクトのプロパティの値を設定し、SQL文を実行します。これでメソッドの実装ができました。UPDATEを行うメソッドも、これとほぼ同じ要領で実装することができます。
ps.setInt ( 1, account.getCategory().getId() ); // カテゴリ(食費) |
Copyright © ITmedia, Inc. All Rights Reserved.