IBATISの内部結合でもうひとパターン試してみた。
今回は内部結合の結果用クラス(DTO)を自作したパターン。
今回はIBATORは使用しないでSELECT句にフォーカスを
絞った情報かと。
参考ページ
http://www63.tok2.com/home2/jd4/iBatisJoin.html
前回同様、IBATORでジェネレートした各種リソースをもとに試した。
JOINしたクエリは下記のものを想定
SELECT
EMPLOYEE.EMPNO,
EMPLOYEE.LASTNAME,
EMPLOYEE.HIREDATE,
DEPARTMENT.DEPTNO,
DEPARTMENT.DEPTNAME
FROM EMPLOYEE, DEPARTMENT
WHERE
EMPLOYEE.WORKDEPT = DEPARTMENT.DEPTNO
AND EMPLOYEE.EMPNO = ?
なので、EMPLOYEE と DEPARTMENT を最初に作成した。
EMPLOYEE
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| EMPNO | int(10) unsigned | NO | PRI | NULL | auto_increment |
| LASTNAME | varchar(45) | NO | | | |
| HIREDATE | datetime | NO | | | |
| WORKDEPT | int(10) unsigned | NO | | | |
+----------+------------------+------+-----+---------+----------------+
DEPARTMENT
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| DEPTNO | int(10) unsigned | NO | PRI | NULL | auto_increment |
| DEPTNAME | varchar(45) | NO | | | |
+----------+------------------+------+-----+---------+----------------+
次にIBATORで関連ファイルを生成
EMPLOYEE_SqlMap.xml を修正
今回の結合結果用のresultMapを定義
クラス(DTO)はdto.Employee2 とする
<resultMap id="EmployeeWithDepartment" class="dto.Employee2">
<result property="employeeId" column="EMPNO" />
<result property="employeeName" column="LASTNAME" />
<result property="joinDate" column="HIREDATE" />
<result property="department.deptno" column="DEPTNO" />
<result property="department.deptname" column="DEPTNAME" />
</resultMap>
内部結合のSELECTの定義
条件設定は結合元のdtoを使用(dto.Employee)
<select id="getEmployee" parameterClass="dto.Employee" resultMap="EmployeeWithDepartment">
SELECT
EMPLOYEE.EMPNO AS EMPNO,
EMPLOYEE.LASTNAME AS LASTNAME,
EMPLOYEE.HIREDATE AS HIREDATE,
DEPARTMENT.DEPTNO AS DEPTNO,
DEPARTMENT.DEPTNAME AS DEPTNAME
FROM EMPLOYEE, DEPARTMENT
WHERE EMPLOYEE.WORKDEPT = DEPARTMENT.DEPTNO
AND EMPLOYEE.EMPNO = #empno#
</select>
カラムのエイリアス名とresutlMapのcolumnを対応させて、さらにcolumnとpropertyを
マッピングする。
Employee2の作成
IBATORで生成されたEmployeeにDepartmentをメンバに加えて、
getterとsetterを追加する。
DAOのインタフェースを追加
EmployeeDAO.javaに今回JOIN用のメソッドを定義
public Employee2 getEmployee(dto.Employee employee);
Employee2を返すgetEmployee
インタフェースを実装(DAO Frame Workを使用しているので)
EmployeeDAOImpl.javaに実装
@Override
public Employee2 getEmployee(dto.Employee employee) {
Employee2 record = (Employee2) queryForObject("EMPLOYEE.getEmployee", employee);
return record;
}
select句のIDとメソッド名をあわせる。parameterClassとメソッドの引数をあわせる。
queryForObjectの第一引数は、MapファイルのSqlMap.xmlの前の名称。
EMPLOYEE_SqlMap.xmlの場合、EMPLOYEE。
実行はこんな感じ。
Reader reader;
reader = Resources.getResourceAsReader("dao.xml");
daoManager = DaoManagerBuilder.buildDaoManager(reader);
EmployeeDAO dao = (EmployeeDAO)daoManager.getDao(EmployeeDAO.class);
Employee employee = new Employee();
employee.setEmpno(1);
// 検索処理(JOIN)
Employee2 emp2 = dao.getEmployee(employee);
今回のJOINのクエリはEmployeeのDAOに実装している。
DAOとDAOImpleとMAPファイル全て、JOIN用に別途定義しても
良いのかもしれないが、どのように定義するのがスタンダードか
不明です。
今回つまずいたことは、resultMap のproperty名とdtoのメンバ名が
異なっていたこと。
IBATORでdtoを生成すると、メンバ名はDBのカラム名と同一になる。
propertyをDBのカラムと異なる設定にしたい場合は、
dtoは手動で作成する必要がある。
まぁ、通常はカラムと同じであるから問題ないか。
今回は内部結合の結果用クラス(DTO)を自作したパターン。
今回はIBATORは使用しないでSELECT句にフォーカスを
絞った情報かと。
参考ページ
http://www63.tok2.com/home2/jd4/iBatisJoin.html
前回同様、IBATORでジェネレートした各種リソースをもとに試した。
JOINしたクエリは下記のものを想定
SELECT
EMPLOYEE.EMPNO,
EMPLOYEE.LASTNAME,
EMPLOYEE.HIREDATE,
DEPARTMENT.DEPTNO,
DEPARTMENT.DEPTNAME
FROM EMPLOYEE, DEPARTMENT
WHERE
EMPLOYEE.WORKDEPT = DEPARTMENT.DEPTNO
AND EMPLOYEE.EMPNO = ?
なので、EMPLOYEE と DEPARTMENT を最初に作成した。
EMPLOYEE
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| EMPNO | int(10) unsigned | NO | PRI | NULL | auto_increment |
| LASTNAME | varchar(45) | NO | | | |
| HIREDATE | datetime | NO | | | |
| WORKDEPT | int(10) unsigned | NO | | | |
+----------+------------------+------+-----+---------+----------------+
DEPARTMENT
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| DEPTNO | int(10) unsigned | NO | PRI | NULL | auto_increment |
| DEPTNAME | varchar(45) | NO | | | |
+----------+------------------+------+-----+---------+----------------+
次にIBATORで関連ファイルを生成
EMPLOYEE_SqlMap.xml を修正
今回の結合結果用のresultMapを定義
クラス(DTO)はdto.Employee2 とする
<resultMap id="EmployeeWithDepartment" class="dto.Employee2">
<result property="employeeId" column="EMPNO" />
<result property="employeeName" column="LASTNAME" />
<result property="joinDate" column="HIREDATE" />
<result property="department.deptno" column="DEPTNO" />
<result property="department.deptname" column="DEPTNAME" />
</resultMap>
内部結合のSELECTの定義
条件設定は結合元のdtoを使用(dto.Employee)
<select id="getEmployee" parameterClass="dto.Employee" resultMap="EmployeeWithDepartment">
SELECT
EMPLOYEE.EMPNO AS EMPNO,
EMPLOYEE.LASTNAME AS LASTNAME,
EMPLOYEE.HIREDATE AS HIREDATE,
DEPARTMENT.DEPTNO AS DEPTNO,
DEPARTMENT.DEPTNAME AS DEPTNAME
FROM EMPLOYEE, DEPARTMENT
WHERE EMPLOYEE.WORKDEPT = DEPARTMENT.DEPTNO
AND EMPLOYEE.EMPNO = #empno#
</select>
カラムのエイリアス名とresutlMapのcolumnを対応させて、さらにcolumnとpropertyを
マッピングする。
Employee2の作成
IBATORで生成されたEmployeeにDepartmentをメンバに加えて、
getterとsetterを追加する。
DAOのインタフェースを追加
EmployeeDAO.javaに今回JOIN用のメソッドを定義
public Employee2 getEmployee(dto.Employee employee);
Employee2を返すgetEmployee
インタフェースを実装(DAO Frame Workを使用しているので)
EmployeeDAOImpl.javaに実装
@Override
public Employee2 getEmployee(dto.Employee employee) {
Employee2 record = (Employee2) queryForObject("EMPLOYEE.getEmployee", employee);
return record;
}
select句のIDとメソッド名をあわせる。parameterClassとメソッドの引数をあわせる。
queryForObjectの第一引数は、MapファイルのSqlMap.xmlの前の名称。
EMPLOYEE_SqlMap.xmlの場合、EMPLOYEE。
実行はこんな感じ。
Reader reader;
reader = Resources.getResourceAsReader("dao.xml");
daoManager = DaoManagerBuilder.buildDaoManager(reader);
EmployeeDAO dao = (EmployeeDAO)daoManager.getDao(EmployeeDAO.class);
Employee employee = new Employee();
employee.setEmpno(1);
// 検索処理(JOIN)
Employee2 emp2 = dao.getEmployee(employee);
今回のJOINのクエリはEmployeeのDAOに実装している。
DAOとDAOImpleとMAPファイル全て、JOIN用に別途定義しても
良いのかもしれないが、どのように定義するのがスタンダードか
不明です。
今回つまずいたことは、resultMap のproperty名とdtoのメンバ名が
異なっていたこと。
IBATORでdtoを生成すると、メンバ名はDBのカラム名と同一になる。
propertyをDBのカラムと異なる設定にしたい場合は、
dtoは手動で作成する必要がある。
まぁ、通常はカラムと同じであるから問題ないか。