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は手動で作成する必要がある。

まぁ、通常はカラムと同じであるから問題ないか。

ついに7月期のアニメが始まりましたね。

まずは、黒執事2。前作見ていて結構好きでしたよ。執事が

なぜ悪魔なのか?そして何でもこなすスーパー執事。

某お嬢様の執事もなかなか常識破りではありますが。

正直、続編があるとは思っていませんでした。

前作の最終回でお坊ちゃまがこの世から旅立っていったはずだから。

今作の冒頭で、お坊ちゃまのポジションと執事両方のキャラが

前作と違うので、なぜ2かと。

まぁ、後半でセバスチャンが登場し、ラストで前作のシエルが

復活(?)するみたいなのでようやく2なんだと思えた。

でも期待できそう。

それから、アロイスのCVが水樹奈々であることが驚いた。

基本的にキャラの声だとわからない。

私の場合、フェイトしかわからん。

ランファンもエンディングロールで水樹奈々とわかり、言われてみれば

そうかもといった感じです。



戦いが決着。

そしてホーエンハイムも逝ってしまった。

お父様は真理(神?)には敵わなかった。

今回も脇役ではあったが、グリードがカッコよかった。

この前のキンブリーと言い、かなりの悪が男気を最後

に見せるのが憎いなぁと。

次回は最終回、どんなにフィナーレになるのだろう??