Seasarにさわるさー S2DAO

作成 2004/10/10
更新 2004/10/14

SeasarではAOPを利用してDBアクセス(O/Rマッピング)ツールを提供しています。 このツールはS2DAOと呼ばれ、効果的にAOPが利用されています。

環境設定

SeasarのWebページから、S2DAOをダウンロードします。ここでは現時点の最新版のV1.0.12をダウンロードしました。

必要なJARと設定ファイルの配置

以下の設定を行います。

その他にJDBCドライバも必要です。HSQLDBを利用しない場合は、別途JDBCドライバをクラスパスに通します。ここではRDBにはMySQLを利用しました。

j2ee.diconの設定

JDBCの設定をj2ee.diconに記述します。MySQLの場合は次のようになります。

<component name="xaDataSource"
    class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
    <property name="driverClassName">
        "com.mysql.jdbc.Driver"
    </property>
    <property name="URL">
        "jdbc:mysql://localhost/blog?useUnicode=true&characterEncoding=SJIS
    </property>
    <property name="user">"root"</property>
    <property name="password">""</property>
</component>

AOPの後に途中飛ばして、いきなりS2DAOをやって、途中のドキュメント読まずに勘でやってます。間違ってたらごめんなさい。

テーブルとDAO

テーブル作る

ここでは、データベースに以下のテーブルを作成しました。

CREATE TABLE CD(
  ID INTEGER NOT NULL,
  TITLE VARCHAR(100),
  CONTENT VARCHAR(200),
  PRIMARY KEY(ID)
);

値クラスを作る

このテーブルに対応するクラスを作成します。

Cd.java

package dao;

public class Cd {

    public static final String TABLE = "CD";
    
    private int id;
    private String title;
    private String content;

    
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}

カラム名に対応したプロパティー(セッタ、ゲッタ)を用意します。用意しなかったプロパティーは、SELECTやUPDATEで無視されます(検索、更新対象に含みません)。また、

public static final String TABLE = "CD";

という部分で、対応するテーブル名を定義しています。これが定数アノテーションという方法で、XMLにわらわら書く代わりに定数で定義する方法をとります(ただし、この例の場合はテーブル名とクラス名が同じなので省略可能)。

DAOの作成

次にDAOを作成します。DAOは上記のCdクラスを検索、更新するためのクラスです。というかインターフェイスです。インターフェイスの実装部分は、DIコンテナがAOPで作成してくれます。BEAN定数アノテーションには、このDAOが作成するクラスを指定します。

CdDao.java

package dao;

import java.util.List;

public interface CdDao {

    public Class BEAN = Cd.class;
    
    public int update(Cd cd);
    
    public int insert(Cd cd);

    public int delete(Cd cd);
    
    public List getAllCds();
    
}

DAOの登録

diconファイルにDAOを登録します。ここでは、dao.diconに直接記述しますが、別のdiconファイルに記述してincludeしてもよいでしょう。aspectにS2DaoInterceptorを指定しています。

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components namespace="dao">
    <include path="j2ee.dicon"/>

    <component
        class="org.seasar.dao.impl.DaoMetaDataFactoryImpl"/>
    <component name="interceptor"
        class="org.seasar.dao.interceptors.S2DaoInterceptor"/>
        
    <component name="CdDao" class="dao.CdDao">
        <aspect>interceptor</aspect>
    </component>

</components>

実行してみる

作成したDAOを利用してINSERTを行う処理がこれ。

package dao;

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");
        CdDao dao = (CdDao)container.getComponent(CdDao.class);

        Cd cd = new Cd();
        cd.setId(1);
        cd.setTitle("ほげほげ");
        cd.setContent("あははは");
        dao.insert(cd);

    }
}

実行するとこんなログが表示されます。

DEBUG 2004-10-10 15:23:20,235 [main] 物理的なコネクションを取得しました
DEBUG 2004-10-10 15:23:20,235 [main] 論理的なコネクションを取得しました
DEBUG 2004-10-10 15:23:20,295 [main] 論理的なコネクションを閉じました
DEBUG 2004-10-10 15:23:20,315 [main] 論理的なコネクションを取得しました
DEBUG 2004-10-10 15:23:20,315 [main] INSERT INTO CD (content, id, title) VALUES('あははは', 1, 'ほげほげ')
DEBUG 2004-10-10 15:23:20,355 [main] 論理的なコネクションを閉じました

実際DBにも入ってます。

mysql> select * from cd;
+----+----------+----------+
| ID | TITLE    | CONTENT  |
+----+----------+----------+
|  1 | ほげほげ | あははは |
+----+----------+----------+
1 row in set (0.00 sec)

なお、更新はupdate()、削除はdelete()、全件検索はgetAllCds()※で可能です。このあたりのメソッドは、S2DAOの名前規則により自動的にSQLを生成、発効してくれます。

※返り値とメソッド名から自動生成のSQLが決定されるので、List getHoge()でも全件検索なり

いろいろ

SQLのカスタマイズ

http://d.hatena.ne.jp/muimy/20041014#1097759592

バインド変数

http://d.hatena.ne.jp/muimy/20041014#1097761804

トランザクション

http://d.hatena.ne.jp/muimy/20041014#1097761821

自動生成カラムのインサート

http://d.hatena.ne.jp/muimy/20041014#1097761839

@TODO

もうちょっとしないとねー

参考

Seasarのドキュメント
http://homepage3.nifty.com/seasar/document.html


BACK | TOP