DAOの作成
DAOの作成
次にDAOクラスを作成します。次のようになります。
リスト4:VideoDao.java
package hoge;
import java.util.List;
public interface VideoDao {
public Class BEAN = Video.class;
public int update(Video video);
public int insert(Video video);
public int delete(Video video);
public List findAll();
}
VideoDaoは、"インターフェイス"として作成しています。BEANは「定 数アノテーション」で、DTOのクラスを指定します。そして、登録、更新、削除、検索用のメソッドを定義しています。なお、このインターフェイスに対する 実装は、ソース上は「存在しません」。実装は、「定型的な処理」(自動生成可能)なので、実行時にS2が自動生成します。
diconファイルへ登録
作成したDAOクラス(VideoDao)をdiconファイルに登録します。diconファイルとはSeasarの設定ファイルです。ここに登録したコンポーネント(この場合はVideoDao)をS2コンテナから取得すると、必要な処理が追加されます。
リスト5:dao.dicon
"http://www.seasar.org/dtd/components.dtd">


class="org.seasar.dao.impl.DaoMetaDataFactoryImpl"/>

class="org.seasar.dao.interceptors.S2DaoInterceptor"/>


interceptor

クライアントの作成
最後に、DAOを利用するクライアントを作成します。次のようになります。
リスト6:Main.java
package hoge;
import java.util.List;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
public class Main {
public static void main(String[] args) {
S2Container container = S2ContainerFactory.create("dao.dicon");
VideoDao dao = (VideoDao)container.getComponent(VideoDao.class);
List videos = dao.findAll();
for (int i=0; i
System.out.println(videos.get(i));
}
}
}
実行
Mainクラスを実行すると、コンソールに次のように表示されるでしょう。あらかじめデータベースを起動しておく必要があります。
実行結果
DEBUG 2005-02-07 12:11:02,914 [main] 物理的なコネクションを取得しました
DEBUG 2005-02-07 12:11:02,914 [main] 論理的なコネクションを取得しました
DEBUG 2005-02-07 12:11:03,355 [main] 論理的なコネクションを閉じました
DEBUG 2005-02-07 12:11:03,395 [main] SELECT Video.price, Video.title FROM Video
DEBUG 2005-02-07 12:11:03,395 [main] 論理的なコネクションを取得しました
DEBUG 2005-02-07 12:11:03,415 [main] 論理的なコネクションを閉じました
hoge.Video@e80842,title=Eclipse男,price=200
hoge.Video@17653ae,title=Java6 In Action,price=1000
hoge.Video@16fe0f4,title=世界の中心でEclipseを叫ぶ,price=1000
メリットは?
先ほど紹介したS2Daoを利用しないDAOの実装の例と比較すると、コード量がかなり少ないことがわかると思います。コード量が少ないということは、開発コストがかからない上に、綴り間違い、close忘れといった凡ミスも減ることを意味します。
S2Daoは、例えるなら「気の利いた秘書」のようなものです。社長は会社の戦略など本来やるべき仕事に時間をさくべきで、日々の定型作業に忙殺さ れるべきではありません。プログラマはキーパンチャーではなく、必要なビジネスロジックの実装に時間をさくべきです。決まりきった定型作業はなるべく部下 に振っていくべきでしょう。S2Daoという部下は、人件費もかからず文句も言わず、正確な仕事をしてくれます。
O/Rマッパーにはいくつかの種類がありますが、Hibernateなど多くのO/Rマッパーはマッピング定義のXMLが必要で、いくらか自動生成 できるといっても、ファイルが膨大になり、また覚えることも多くあります。S2Daoは、O/Rマッパーの中でも「簡単」に「よくある」処理を自動化して くれます。
ここでは、簡単なCRUD(Create、Read、Update、Delete)の例だけでしたが、もちろん、条件文やJOINなども利用できま すし、トランザクション境界も設定することができます。なお、Webアプリケーションに組み込む場合は、JARファイルをWEB-INF/libに置くだ けで、他は変わりません。
今回はデータベースアクセス用のツール紹介がテーマでしたので、S2自体やAOPについては何も説明していませんが、S2Daoを使いこなしていく 場合は、S2自体のしくみも理解しておくべきでしょう。幸い国産プロジェクトですので日本語ドキュメントも豊富です。
また、S2Daoは、マッピング設定は定数アノテーションで楽をすることができますが、AOPの設定を行う必要があります。この記述を支援する Eclipseプラグインとして「Kijimuna」がありますので、興味のある方は利用してみてください(SeasarプロジェクトのWebサイトから 入手できます)。
まとめ
今回は、データベース操作を効率化するためのツールの例としてS2Daoを紹介しました。Javaのデータベース操作は非常に煩雑、面倒、手間になりがちなので、何らかのデータベースアクセス用のツールを利用することをお勧めします。