« Tapestry Engine Service | メイン | Tapestry Visit and Global »

iBatisで使いまわし

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が発生する場合などに有効に活用できると思います。

ブログ内の関連する記事

トラックバック

このエントリーのトラックバックURL:
http://www.taosoftware.co.jp/mt/mt-tb.cgi/24