作成 2004/10/10
更新 2004/10/14
SeasarではAOPを利用してDBアクセス(O/Rマッピング)ツールを提供しています。 このツールはS2DAOと呼ばれ、効果的にAOPが利用されています。
SeasarのWebページから、S2DAOをダウンロードします。ここでは現時点の最新版のV1.0.12をダウンロードしました。
以下の設定を行います。
 
その他にJDBCドライバも必要です。HSQLDBを利用しない場合は、別途JDBCドライバをクラスパスに通します。ここではRDBにはMySQLを利用しました。
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をやって、途中のドキュメント読まずに勘でやってます。間違ってたらごめんなさい。
ここでは、データベースに以下のテーブルを作成しました。
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は上記の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();
    
}
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()でも全件検索なり
もうちょっとしないとねー
Seasarのドキュメント
http://homepage3.nifty.com/seasar/document.html