RDBを利用していると、かならず複数のテーブルには関連性があります。
アプリケーションを作成するときに、それらの情報を結合して処理をすることになります。

2つのテーブルに対し別々にSQLを発行して、その結果をビジネスロジック側で結合すればよいことになりますが、iBatisでは、ResultMapの記述を工夫することで、簡単に値を取り出すことができます。
例えば、2つのテーブル(Table1とTable2)が存在し、JavaのBean側は、Bean1がBean2をプロパティとして持っているとします。
こんなときには、以下ののようなマッピングファイルを準備しましょう。

<resultMap id="bean1HasBean2" class="sample.iBatis.bean1">
<result property="id" column="TABLE1_ID" />
<result property="value" column="TABLE1_VALUE" />
<result property="bean2Obj" column="TABLE2_ID" select="getBean2" />
</resultMap>
<select id="getBean1" parameterClass="string" resultMap="bean1HasBean2">
SELECT * FROM TABLE1 WHERE TABLE1_ID = #value#
</select>
<select id="getBean2" parameterClass="string" resultClass="sample.iBatis.bean2">
SELECT TABLE2_ID AS id, TABLE2_VALUE AS value FROM TABLE2 WHERE TABLE2_ID = #value#
</select>

このようなSqlMapを作成して、getBean1を呼び出せば、getBean1で取得した「TABLE2_ID」の値を利用して、getBean2が実行され、getBean2の結果が、bean2Objに設定されるということになります。

簡単に使いたいケースでは結構使えるかもしれません。
ただし、このような使い方を行った場合、テーブルの関連性によっては、多数のSQLが発行されるケースが考えられます。
例えば、getBean1の結果が大量の行を返すような場合です。

それに、通常SQLを使っているような方なら、テーブルをJOINして取得することを考えると思います。
iBatisでは、マッピングファイルにSQL文を直接記述するので、JOINした結果を取得するのも簡単にできます。
以下では、JOINを利用して上記と同じ結果を取得するためのサンプルを記述していきます。


まず、sqlMapの記述です。

<resultMap id="allParamBean1" class="sample.iBatis.bean1">
<result property="id" column="TABLE1_ID" />
<result property="value" column="TABLE1_VALUE" />
<result property="bean2Obj.id" column="TABLE2_ID" />
<result property="bean2Obj.value" column="TABLE2_VALUE" />
</resultMap>
<select id="getAllParamBean1" parameterClass="string" resultMap="allParamBean1">
SELECT TABLE1.TABLE1_ID AS TABLE1_ID,
TABLE1.TABLE1_VALUE AS TABLE1_VALUE,
TABLE2.TABLE2_ID AS TABLE2_ID,
TABLE2.TABLE2_VALUE AS TABLE2_VALUE
FROM TABLE1 JOIN TABLE2 ON TABLE1.TABLE2_ID = TABLE2.TABLE2_ID
WHERE TABLE1.TABLE1_ID = #value#
</select>

こんな感じです。
Hibernate等よりは簡単にJOIN等を実行できるのではないでしょうか。
Hibernate等だとLazyLoading等で、必要になったときに取得するというのが一般的かと思いますが。。
もちろん、iBatisでもLazyLoadingはできるのですが、実はまだちゃんと調べてません。
調査したら、またアップするようにします。

ブログ内の関連する記事