* [[S2Dao]]
本当に楽になったと感じさせてくれるO/Rマッピングを探しています..... がんばれ!S2Dao!
#contents

** 環境
http://s2dao.seasar.org/ja/index.htmlよりS2Dao 1.0.46(2007/09/11)をダウンロードしました。またhttp://s2dao.seasar.org/ja/s2dao.htmlにドキュメントがあるので、参照しましょう。[[ S2DaoでXMLレスなO/Rマッピングを行う>http://codezine.jp/a/article.aspx?aid=303]]を参考にして試してみました。サンプルはs2daoが1.0.29、s2-extensionが2.3.4、s2-frameworkが2.3.4でしたので、
 s2-dao-1.0.46.jar
 s2-extension-2.3.22.jar
 s2-framework-2.3.22.jar
に入れ替え、j2ee.diconのxaDataSourceを自分の環境にあわせて修正し、dao.diconは1.0.36からs2-daoのjarに含まれているようですので、削除して動かしました。~
[[s2dao用のSQLファイルを開くeclipseプラグイン>http://www.wikihouse.com/uronim1/index.php?s2dao]]は便利なので、ぜひ入れておきましょう。~
またhttp://s2dao.seasar.org/ja/index.htmlからダウンロードしたs2-dao-1.0.46.zipですが、展開後、Eclipseにインポートし、
 /s2dao-1.0.x/s2-dao-examples/src/main/java/examples/dao/EmployeeDaoClient.java
を実行使用として、
 /s2dao-1.0.x/s2-dao-examples/src/main/resources/j2ee.dicon
をなおしたんですが、他にある
 /s2dao-1.0.x/s2-dao/src/test/resources/j2ee.dicon
を先に参照していたようで、pathの優先度を変更するか、名前を変更するかすれば参照してくれるようになりました。では実行しましょう。DBはmysqlです。
 ErrorCode=1052 Column: 'deptno' in where clause is ambiguous
あら?mysqlで日付型をnull可にして、未設定である場合は、
 Cannot convert value '0000-00-00'
とかでてるのはいつものことなので、いいのですが、deptnoが曖昧?確かに投げられているSQLを見ると曖昧なので、
 /s2dao-1.0.x/s2-dao-examples/src/main/java/examples/dao/EmployeeDao.java
の
 public String getEmployeeByDeptno_QUERY = "/*IF deptno != null*/deptno = /*deptno*/123\n"
			+ "-- ELSE 1=1\n" + "/*END*/";
を
 public String getEmployeeByDeptno_QUERY = "/*IF deptno != null*/emp.deptno = /*deptno*/123\n"
			+ "-- ELSE 1=1\n" + "/*END*/";
に変更して動かしました。
またSQLファイルを使用する場合は、順番に引数の値が渡されますが、Conditionクラスを渡してあげるほうが後のことを考えるとよいですね。もしくは、EntityManagerを使って動的にwhere句やorder by句を付加できますので、Conditionクラスを渡してDaoImplから投げるほうもいいかもしれないです。Employee2DaoClient.javaのEmployee2DaoImpl.javaにサンプルがあります。
** 複数テーブル
複数テーブルのN:1マッピングを使う場合は、つまりOUTER JOINしたい場合は、DTO(Entity)に
 // N:1 1つ目のOUTER JOIN
 //これがSQLで投げられるときにサフィックスとして付加され、別テーブル同一項目名があっても大丈夫になっている
 public static final int department_RELNO = 0; 
 //同じなので省略できる
 public static final String department_RELKEYS = "deptno:deptno"; 
 // N:1 2つ目のOUTER JOIN
 public static final int department2_RELNO = 1;
 //Nテーブルから1へテーブルを参照するときに複数の項目から、同一のテーブルを参照する場合でもアクセッサに名前をつけて(例ではdepartment2)やればいける。
 public static final String department2_RELKEYS = "deptno2:deptno"; 
 // N:1 3つ目のOUTER JOIN
 public static final int employee_RELNO = 2;
 public static final String employee_RELKEYS = "empno:empno";
 
 private Department department;
 private Department department2;
 private Employee employee;
 //あとdepartment,department2,employeeのアクセッサが必要
もしくはSQLファイルを作成してべたに作る。S2DAOプラグインでDAOのメソッド上で、「対応するSQLを開く」を選択すると楽。
このとき使うDTOはとりあえず、tableアノテーションは存在するテーブルを指定しておき、アクセッサを用意する。
 public static final String TABLE = "emp";

** TIPS
*** DTO (Entity)
DTOを作るのがめんどくさいので、[[PowerDBJプラグイン>http://www.powerbeans.co.jp/modules/tinyd2/index.php?id=4]]を使わせてもらってます。http://www.seasar.org/sandbox.html#javaにあるのも検討したんですが、iBATISや別のときも汎用的に使えそうだったので、これを使っています。
アクセッサがprivateになるときは、
 plugins\jp.co.powerbeans.eclipse.plugin.powerdbj_1.0.0\template\java\TableModel.java
を修正しておきましょう。
昔Excelから生成するやつを作ったんですが([[blanco]]のしょっぽい版)、どっかいっちゃった...

*** 大量件数の場合
たまに大量件数を考慮していないのがあるのですが、s2daoではhttp://s2dao.seasar.org/ja/s2pager.htmlをつかいます。
空読みからDB固有の場合をサポートしてますので、使い分けできます。
** 調査
*** EntityManagerからSQLファイルを使えない。
** リンク
-[[ S2DaoでXMLレスなO/Rマッピングを行う>http://codezine.jp/a/article.aspx?aid=303]]~
-[[DBFlute>http://dbflute.sandbox.seasar.org/ja/index.html]]~
S2Daoで利用するDao/EntityをDatabaseのSchema情報を利用して自動生成しますとあるので、使ってみたのですが、ちょっと自分には合わなかったです。
** 参考書籍

--** コメント
-iXixWVDEaru -- [[qyvyxendhj]] &new{2008-09-06 (土) 03:58:05};
--#comment

#comment


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS