1.S2Dao 特殊なDao
スポンサード リンク1.特殊なDao
今までは、テーブルと1対1のBeanを用いて、マッピングしSQLを自動生成していましたが、今回は特殊なDaoを記載したいと思います。
オブジェクト中心でパッケージ構成等を設定できればいいのですが、画面単位(ユースケース単位)でlogicクラスやDaoクラスが分かれていた場合にテーブルと1対1ということはなく複数テーブルにアクセスする場合、どこのテーブルと対応させていいか迷ったりしてしまいます。
そんな場合に、対応させるBeanを限定させずにDaoを作成することができます。
取得する結果は、MapまたはBeanを限定せずに取得することができます。
メリット
- 対応させるBeanを指定しなくてもDaoが作成できる
デメリット
- SQLの自動生成ができない
- 発行するSQLはSQLファイルにて記載する
S2Daoの最大のメリットであるSQLの自動生成ができないのは、かなりのデメリットとなっているのですがSQLファイルを使用することができるので
それを用いることでカバーできるのではないかなと思います。
また更新系については、対象のテーブルが1つに絞れているのでその場合には別のDaoを作成する形でよいのではないかと思います。
では早速サンプルを見てみたいと思います。
まず、アクセスするためのテーブルは以下のようになります。
CREATE TABLE "PROJECT" ( "ID" NUMBER NOT NULL ENABLE, "PJNAME" VARCHAR2(100) NOT NULL ENABLE, CONSTRAINT "PROJECT_PK" PRIMARY KEY ("ID") ENABLE ) / CREATE TABLE "TASK" ( "ID" NUMBER, "TASK_NAME" VARCHAR2(4000), "PJ_ID" NUMBER, CONSTRAINT "TASK_PK" PRIMARY KEY ("ID") ENABLE ) /
今までのテーブルのPROJECTに加えて、TASKというテーブルを追加してあります。
PROJECTとTASKは1対Nの関係となっています。(本来ならFK等を張るところですが今回は省略しています)
次に、発行するSQLは以下のようになります。
発行するSQLファイル(CommonDao_selectCommonDao.sql)
SELECT pj.ID AS pj_id ,pj.PJNAME ,ta.ID AS task_id ,ta.TASK_NAME FROM PROJECT pj ,TASK ta WHERE pj.ID = ta.PJ_ID
発行するSQLの内容としては、「」と「」を結合しているだけの簡単なSQLとなっています。
次に、作成するDaoは以下のようになります。
CommonDao.java
package snowhiro; import java.util.List; import java.util.Map; import org.seasar.dao.annotation.tiger.SqlFile; public interface CommonDao { @SqlFile public List<Map> selectCommonDao(); }
ただのインターフェイスとなっており、Beanの結びつけ等の記載は特にはありません。
今回は、取得結果をBeanではなくMapで取得していますが、取得結果はBeanでも取得することができます。
次に対象のメソッドを呼び出すためのメインクラスを記載してみます。
S2Dao_sample10.java
package snowhiro; import java.util.List; import java.util.Map; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.SingletonS2ContainerFactory; /** * S2Daoのサンプルメインクラス */ public class S2Dao_sample10 { // 設定ファイルのPath private static final String PATH = "snowhiro/s2Dao.dicon"; /** * メインクラス * @param args 引数 */ public static void main(String[] args) { System.out.println("S2Dao_sample10 開始"); // 設定ファイルを読み込む. SingletonS2ContainerFactory.setConfigPath(PATH); // 初期化する. SingletonS2ContainerFactory.init(); // コンテナを取得する. S2Container container = SingletonS2ContainerFactory.getContainer(); CommonDao cd = (CommonDao) container.getComponent(CommonDao.class); List<Map> taskList = cd.selectCommonDao(); int i = 0; for (Map map: taskList) { i++; System.out.println(i + "行目 : " + map); } } }
では実際に実行してみたいと思います。
S2Dao_sample10 開始 DEBUG S2Containerを作成します。path=snowhiro/s2Dao.dicon DEBUG S2Containerを作成します。path=dao.dicon DEBUG S2Containerを作成します。path=j2ee.dicon DEBUG S2Containerを作成します。path=jta.dicon DEBUG S2Containerを作成しました。path=jta.dicon DEBUG S2Containerを作成します。path=jdbc.dicon DEBUG S2Containerを作成しました。path=jdbc.dicon DEBUG S2Containerを作成しました。path=j2ee.dicon DEBUG S2Containerを作成しました。path=dao.dicon DEBUG S2Containerを作成しました。path=snowhiro/s2Dao.dicon INFO Running on [ENV]product, [DEPLOY MODE]Normal Mode DEBUG トランザクションを開始しました。tx=[FormatId=4360, GlobalId=1219585809831/0, BranchId=] DEBUG 物理的なコネクションを取得しました DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1219585809831/0, BranchId=] DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1219585809831/0, BranchId=] DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1219585809831/0, BranchId=] DEBUG SELECT pj.ID as pj_id ,pj.PJNAME , ta.ID as task_id , ta.TASK_NAME FROM PROJECT pj , TASK ta WHERE pj.ID = ta.PJ_ID DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1219585809831/0, BranchId=] DEBUG トランザクションをコミットしました。tx=[FormatId=4360, GlobalId=1219585809831/0, BranchId=] 1行目 : {pjid=1, pjname=S2Dao, taskid=1, taskname=特殊なDaoの説明をする。} 2行目 : {pjid=1, pjname=S2Dao, taskid=2, taskname=Mapの場合はどうなるのか?}
このように自動生成は使えなくなってしまいますが、Beanを指定することなくDaoが作成することができます。
Seasar2 Topに戻る