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用のSQLファイルを開くeclipseプラグインは便利なので、ぜひ入れておきましょう。
また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.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ファイルを使えない。

リンク

参考書籍

  • ** コメント
  • #comment

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-09-06 (土) 01:21:00 (5731d)