[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
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の部分の<component>タグをコメントアウトしpostgreSQLの<component>タグをコメントを解除しDB名とユーザ名、パスワードを指定する。
これで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を指定する。
テーブルのカラム名とDTOのカラム名が等しいとき以外は
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<TranDto>にしたらうまくいった。
Listだけでうまくいくのかなぁ?
さて次はSQLファイルの作成。
これはresourceに配置します。
命名規則はDao名_メソッド名.sqlになってます。
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 }
な結果が返ってくるはず!!
