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