* [[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