SQLを使ったアプリケーションを作成していると、同じ条件文が発生したりすることがあると思います。
例えば、件数を取得するSQLと情報自体を取得するSQLなどですね。

このような場合、iBatisでは、以下のように記述することで、同じ条件文を使いまわしたりすることができるようになります。

<sql id="userWhere">
<dynamic prepend="WHERE">
<isPropertyAvailable prepend="AND" property="AND_id_NULL">
id IS NULL
</isPropertyAvailable>
<isPropertyAvailable prepend="OR" property="OR_id_NULL">
id IS NULL
</isPropertyAvailable>
<isPropertyAvailable prepend="AND" property="AND_id_NOTNULL">
id IS NOT NULL
</isPropertyAvailable>
<isPropertyAvailable prepend="OR" property="OR_id_NOTNULL">
id IS NOT NULL
</isPropertyAvailable>
<isPropertyAvailable prepend="AND" property="AND_name_EQ">
name = #name#
</isPropertyAvailable>
<isPropertyAvailable prepend="AND" property="AND_name_LIKE">
name like #name#
</isPropertyAvailable>
</dynamic>
</sql>

<select id="getUser3" resultMap="resultUser" parameterClass="java.util.Map">
SELECT ID AS id,
NAME AS name
FROM USER_TABLE
<include refid="userWhere" />
</select>

<select id="getCountUser3" parameterClass="java.util.Map">
SELECT COUNT(*)
FROM USER_TABLE
<include refid="userWhere" />
</select>


<sql id=”userWhere”>と、<include refid=”userWhere” />の部分に注目してください。
<sql>の中に、複数回(今回は2回)発生するSQLのWHERE句に関する記述を入れてあります。
で、
<select>の方で、<include refid=”userWhere” />で、WHERE句の使いまわしを行っています。

各SQLを実行するための手段については、今までと変わりありませんので省略しますが、基本的な使い方は簡単なので、使うことを検討してみてください。
なお、今回はパラメータにjava.util.Mapを利用していますが、parameterClassを利用するよう設計した方が、パフォーマンスが向上します。

今回はWHERE句の部分を動的に生成し、使いまわしできるようにしましたが、動的にSQLを生成し、複数回同じSQLが発生する場合などに有効に活用できると思います。

ブログ内の関連する記事