S2Dao本当に楽になったと感じさせてくれるO/Rマッピングを探しています..... がんばれ!S2Dao! 環境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マッピングを行うを参考にして試してみました。サンプルは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-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"; TIPSDTO (Entity)DTOを作るのがめんどくさいので、PowerDBJプラグインを使わせてもらってます。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ファイルを使えない。リンク
参考書籍
|