作成 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