ひがやすを技術ブログ

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

最終仕様案

結局、XMLなしのPOJOベース(BeanもDaoも)で考えています。
次のようなDaoのI/Fを考えます。


interface EmployeeDao
BEAN_CLASS = Employee.class;
GETEMPLOYEE_AUTO = "select";
GETEMPLOYEE_ARGS = "empno";
GETEMPLOYEES_AUTO = "select";
GETEMPLOYEES_ARGS = "deptno";
INSERTEMPLOYEE_AUTO = "insert";
INSERTEMPLOYEE_ARGS = "employee";
UPDATEEMPLOYEE_AUTO = "update";
INSERTEMPLOYEE_ARGS = "employee";
DELETEEMPLOYEE_AUTO = "delete";
DELETEEMPLOYEE_ARGS = "employee";

Employee getEmployee(int empno);
List getEmployees(int deptno);
void insertEmployee(Employee employee);
void updateEmployee(Employee employee);
void deleteEmployee(Employee employee);

Beanは次を参照。
http://d.hatena.ne.jp/higayasuo/20040517#1084764648
http://d.hatena.ne.jp/higayasuo/20040522#1085228150
実装はすべてAOPで実現されます。






基本はたったこれだけ。
それでは、条件によってSQLが変わるようなメソッドをEmployeeDaoに
追加してみましょう。

GETEMPLOYEESBYJOBDEPTNOLIST_ARGS = "job, deptnoList";
List getEmployeesByJobDeptnoList(String job, List deptnoList);
EmployeeDaoと同じパッケージにEmployeeDao_getEmployeesByJobDeptnoList.sql
をおきます。中身は次のとおり。

SELECT * FROM emp
/*BEGIN*/WHERE
/*IF job != null*/job = /*job*/'CLERK'/*END*/
/*IF deptnoList.size() > 0*/AND deptno
IN /*deptnoList*/(10, 20)
/*END*/
/*END*/
jobがnull、deptnoListのサイズが0の場合は、

SELECT * FROM emp
jobがnot null、deptnoListのサイズが0の場合は、

SELECT * FROM emp WHERE job = ?
jobがnot null、deptnoListのサイズが2の場合は、

SELECT * FROM emp WHERE job = ? AND deptno IN(?, ?)
jobがnull、deptnoListのサイズが2の場合は、

SELECT * FROM emp WHERE deptno IN(?, ?)
のように動的に組み立てられます。
実際は、DepartmentとのMany to Oneの関連があるので、
deptテーブルとの外部結合が追加されます。
やることはこれだけ。