最終仕様案
結局、XMLなしのPOJOベース(BeanもDaoも)で考えています。
次のようなDaoのI/Fを考えます。
Beanは次を参照。
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);
http://d.hatena.ne.jp/higayasuo/20040517#1084764648
http://d.hatena.ne.jp/higayasuo/20040522#1085228150
実装はすべてAOPで実現されます。
基本はたったこれだけ。
それでは、条件によってSQLが変わるようなメソッドをEmployeeDaoに
追加してみましょう。
EmployeeDaoと同じパッケージにEmployeeDao_getEmployeesByJobDeptnoList.sql
GETEMPLOYEESBYJOBDEPTNOLIST_ARGS = "job, deptnoList";
List getEmployeesByJobDeptnoList(String job, List deptnoList);
をおきます。中身は次のとおり。
jobがnull、deptnoListのサイズが0の場合は、
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がnot null、deptnoListのサイズが0の場合は、
SELECT * FROM emp
jobがnot null、deptnoListのサイズが2の場合は、
SELECT * FROM emp WHERE job = ?
jobがnull、deptnoListのサイズが2の場合は、
SELECT * FROM emp WHERE job = ? AND deptno IN(?, ?)
のように動的に組み立てられます。
SELECT * FROM emp WHERE deptno IN(?, ?)
実際は、DepartmentとのMany to Oneの関連があるので、
deptテーブルとの外部結合が追加されます。
やることはこれだけ。