UrumaでS2Daoを使用してみる。
UrumaのサイトでDBアクセス用にS2Daoってのが使えるって書いてあったので普通にPreperedStatment使ってもつまらないので早速使ってみる。
使用するDBはPostgreSQL8.2
テーブルは
CREATE TABLE TRAN ( id INTEGER, tname VARCHAR(20), mstno INTEGER ); CREATE TABLE MST (mstno INTEGER, mname VARCHAR(20) );
でTRANのid、MSTのmstnoをPKに設定。
内容はこんな感じ?
TRAN
id | tname | mstno 1 | TRANNAME1 | 20 2 | TRANNAME2 | 20 3 | TRANNAME3 | 21 4 | TRANNAME4 | 21
MST
mstno | mname 20 | MSTNAME1 21 | MSTNAME2
とりあえずPostgreSQLのjarファイルをlibに配置しビルド・パスに通す。
SeasarのサイトのからS2Daoをダウンロード(S2Dao1.0.47)
ダウンロードしたファイルを解凍し、S2Daoのlibフォルダの中のs2-dao-1.0.47.jarと、とりあえずs2-dao-1.0.47-sources.jarをビルド・パスに通す。
それとSeasarのサイトからS2Containerを落とし、libからgeronimo-jtr_1.1_spec-1.0.jarを取得する。
これがないとClassNotFoundException javax/transaction/TransactionSynchronizationRegistryが発生してしまいました。
先ほど落としたS2Daoフォルダ内にもgeronimo-j2ee_1.4_spec-1.0.jarっていう似たものがあるけどうまくいかない。
j2eeって書いてあるからSeasar2.3以前だったらよかったのかな?
次はdiconファイル。
S2Daoのresourcesフォルダからjdbc.diconをとってくる。(Seasar2.3ではj2ee.dicon)
jdbc.diconのhsqlの部分の
これでjdbc.diconの設定は完了。
次はDTO
TranDto.java package s2dao.test.dto; public class TranDto { public static final String TABLE = "TRAN"; public static final int mstdto_RELNO = 0; private int id; private String tname; private int mstno; private MstDto mstdto; public TranDto() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } public int getMstno() { return mstno; } public void setMstno(int mstno) { this.mstno = mstno; } public MstDto getMstdto() { return mstdto; } public void setMstdto(MstDto mstdto) { this.mstdto = mstdto; } @Override public boolean equals(Object obj) { if( ! ( obj instanceof TranDto ) ) { return false; } TranDto other = (TranDto)obj; return this.getId() == other.getId(); } @Override public int hashCode() { return this.getId(); } @Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append(id).append(", "); sb.append(tname).append(", "); sb.append(mstno).append(", { "); sb.append(mstdto).append(" }"); return sb.toString(); } }
クラス名とテーブル名が等しい場合は
public static final String TABLE = "TRAN";
が必要ないらしい。
public static final int mstdto_RELNO = 0;
は2つ以上のテーブルを使用する場合に必要になる。
今はTRANとMSTのみなので値は0だけ。
もうひとつ必要な場合は0と1を指定する。
public static final String mstdto_RELKEYS = "mstno:mstno";
を記述する。
"多側のカラム名1:1側のカラム名1,カラム名2:1側のカラム名2,・・・"
で複数記述も可
他にもあるけどあとはS2DaoのExampleをみてください。
同じようにMstDto.java
package s2dao.test.dto; public class MstDto { public static final String TABLE = "MST"; private Integer mstno; private String mname; public MstDto(){ } public Integer getMstno() { return mstno; } public void setMstno(Integer mstno) { this.mstno = mstno; } public String getMname() { return mname; } public void setMname(String mname) { this.mname = mname; } @Override public boolean equals(Object obj) { if( ! ( obj instanceof MstDto ) ) { return false; } MstDto other = (MstDto)obj; return this.getMstno() == other.getMstno(); } @Override public int hashCode() { return (int)mstno; } @Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append(mstno).append(". "); sb.append(mname); return sb.toString(); } }
次にDaoを・・・。
これはインターフェースになります。
package s2dao.test.dao; import java.util.List; import s2dao.test.dto.TranDto; public interface TableDao { public static final Class BEAN = TranDto.class; public static final String getAllColumn_SQL_FILE = "s2dao/test/sql/TableDao_getAllColumn.sql"; public List<TranDto> getAllColumn(); }
メソッド名_SQL_FILEでDaoと別の位置に配置したSQLファイルとは別に配置できる。
S2DaoのExampleにはpublic List getAllColumn();で値が取得できていたけどうまくいかない。
散々悩んだ挙句List
Listだけでうまくいくのかなぁ?
さて次はSQLファイルの作成。
これはresourceに配置します。
TableDao_getAllColumn.sql
SELECT TRAN.*, MST.mname AS mname_0 FROM TRAN, MST WHERE TRAN.mstno = MST.mstno
MST.mname AS mname_0の_0はTranDto.javaのRELNOの値を指定します。
次はDaoを登録するためのdiconファイルの設定をします。
mysql.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components.dtd"> <components> <include path="dao.dicon"/> <component class="s2dao.test.dao.TableDao"> <aspect>dao.interceptor</aspect> </component> </components>
最後に起動用のJava
SqlStater.java
package s2dao.test.stat; import java.util.List; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.S2ContainerFactory; import s2dao.test.dao.TableDao; import s2dao.test.dto.TranDto; public class SqlStater { private static final String PATH = "mysql.dicon"; public static void main(String[] args) { S2Container container = S2ContainerFactory.create(PATH); container.init(); try { TableDao dao = (TableDao)container.getComponent(TableDao.class); List<TranDto> tableDtoList = dao.getAllColumn(); for( int i = 0; i < tableDtoList.size(); ++i ) { System.out.println(tableDtoList.get(i)); } } finally { container.destroy(); } } }
これで実行すれば
1, TRANNAME1, 20, { 20. MSTNAME1 } 2, TRANNAME2, 20, { 20. MSTNAME1 } 3, TRANNAME3, 21, { 21. MSTNAME2 } 4, TRANNAME4, 21, { 21. MSTNAME2 }
な結果が返ってくるはず!!