帳モメのotanuft

Stay hungry, stay foolish.

iBATIS:Tips 同じSQLをまとめる

SQLMapのXMLを書いていると同じSQLが何度も出現する場合があります。

例えば、検索結果の件数と検索結果を取得したい場合などそんな場合、

同じSQLをまとめておいて<statement/>の中から参照することができます。

<select id="findGuitar" resultMap="guitarResult" parameterClass="string">

SELECT ID, NAME, MAKER_NAME FROM GUITAR

WHERE ID = #value#

</select>

<select id="findGuitarCount" resultClass="int" parameterClass="string">

SELECT COUNT(*) FROM GUITAR

WHERE ID = #value#

</select>

という2つのSQLがあったとします。

上記を比較すると

WHERE ID = #value#の部分が共通です。

そこで、下記のようにまとめます。

<sql id="whereFragment">

WHERE ID = #value#

</sql>

<select id="findGuitar" resultMap="guitarResult" parameterClass="string">

SELECT ID, NAME, MAKER_NAME FROM GUITAR

<include refid="whereFragment"/>

</select>

<select id="findGuitarCount" resultClass="int" parameterClass="string">

SELECT COUNT(*) FROM GUITAR

<include refid="whereFragment"/>

</select>

こうしておけば複雑なSQLもすっきりします。

また、上記のようにパラメータを含むフラグメントでも問題なく実行できます。

別のSQL MAPファイルに定義されたフラグメントもネームスペースを使用すれば

参照できるようです。