ひがやすを技術ブログ

電通国際情報サービスのプログラマ

S2Dao入門(1)

S2Daoではエンティティのクラスを作成するために2つの方法が提供されます。

  • Excelにテーブル定義を書いて、DDL, エンティティのソースを書き出す。DDLを直接データベースに適用することも可能。
  • 作成済みのテーブルのメタデータよりExcel、エンティティのソースを書き出す。

Excelとデータベースのラウンドトリップ開発も可能です。
これらの機能は、antのTaskとして提供されます。
今回は次のようなソースが書き出されたとします。


public class Emp {
public static final int dept_RELNO = 0;
private Integer empno;
private String ename;
private String job;
private Integer deptno;
private Dept dept;

getter, setterメソッド省略
}

public class Dept {
private Integer deptno;
private String dname;

getter, setterメソッド省略
}

Emp用のDaoを作成します。っていってもinterfaceです。

interface EmpDao {
Class BEAN = Emp.class;
List getAllEmps();

String getEmpByEmpno_ARGS = "empno";
Emp getEmpByEmpno(Integer empno);

String getEmpsByJobDeptno_ARGS = "job, deptno";
List getEmpsByJobDeptno(String job, Integer deptno);

void insert(Emp emp);
void update(Emp emp);
void delete(Emp emp);
}

それではさっそくコンポーネントの定義です。えっ。これだけですか。

<component class="EmpDao">
<aspect>
<component class="org.seasar.s2dao.interceptors.S2DaoInterceptor">
</aspect>
</component>
EmpDao#getAllEmps()を実行すると次のようなSQL文が発行されます。
OUTER JOINの構文は、RDBMSを自動的に判定して組み立てます。

SELECT emp.empno, emp.ename, emp.job, emp.deptno, dept.dname AS dname_0
FROM emp LEFT OUTER JOIN dept ON emp.deptno = dept.deptno
EmpDao#getEmpByEmpno(7788)を実行すると次のようなSQL文が発行されます。
7788の部分は実際はバインド変数が使われます。

SELECT emp.empno, emp.ename, emp.job, emp.deptno, dept.dname AS dname_0
FROM emp LEFT OUTER JOIN dept ON emp.deptno = dept.deptno
WHERE emp.empno = 7788
EmpDao#getEmpsByJobDeptno(null, null)を実行すると次のようなSQL文が発行されます。

SELECT emp.empno, emp.ename, emp.job, emp.deptno, dept.dname AS dname_0
FROM emp LEFT OUTER JOIN dept ON emp.deptno = dept.deptno
EmpDao#getEmpsByJobDeptno("CLERK", null)を実行すると次のようなSQL文が発行されます。

SELECT emp.empno, emp.ename, emp.job, emp.deptno, dept.dname AS dname_0
FROM emp LEFT OUTER JOIN dept ON emp.deptno = dept.deptno
WHERE emp.job = 'CLERK'
EmpDao#getEmpsByJobDeptno(null, 30)を実行すると次のようなSQL文が発行されます。

SELECT emp.empno, emp.ename, emp.job, emp.deptno, dept.dname AS dname_0
FROM emp LEFT OUTER JOIN dept ON emp.deptno = dept.deptno
WHERE emp.deptno = 30
EmpDao#getEmpsByJobDeptno("CLERK", 30)を実行すると次のようなSQL文が発行されます。

SELECT emp.empno, emp.ename, emp.job, emp.deptno, dept.dname AS dname_0
FROM emp LEFT OUTER JOIN dept ON emp.deptno = dept.deptno
WHERE emp.job = 'CLERK' AND emp.deptno = 30
EmpDao#insert()を実行すると次のようなSQL文が発行されます。

INSERT INTO emp(empno, ename, job, deptno)
VALUES(emp.empno, emp.ename, emp.job, emp.deptno)
EmpDao#update()を実行すると次のようなSQL文が発行されます。
emp.*の部分は実際はバインド変数です。

UPDATE emp SET empno = emp.empno, ename = emp.ename,
job = emp.job, deptno = emp.deptno
WHERE empno = emp.empno
EmpDao#delete()を実行すると次のようなSQL文が発行されます。
emp.*の部分は実際はバインド変数です。

DELETE FROM emp
WHERE empno = emp.empno
このような開発者の心(method signature)を読んでSQLを自動生成する機能は
S2Daoのうりの1つです。
自動生成の法則の説明はまた後で。