ibatisページングの簡単な実装

3013 ワード

ibatis物理ページングの簡単な実現
cheungmine 2013-8-26
SSI(Struts 2,Spring 3,iBATIS 2.3)フレームワークを用いてWebサービスを開発する際に必要なのは,クエリの結果をページごとに表示することである.iBATIS 2のクエリ関数は、主にqueryForListとqueryForPaginatedListがあります.
queryForPaginatedListは、データ量が大きくなると性能が急激に低下、まったく使用できないほど、直接ページ分けできるという.
 
queryForListに戻り、以下の呼び出しでqueryEntitiesのすべてのデータを取得できます.
        List entities = null;        entities = getSqlMapClientTemplate().queryForList("queryEntities", paramsMap);
レコードの合計数を知る必要がある場合は、次の手順に従います.
        List rowCount = getSqlMapClientTemplate().queryForList("getRowCount", paramsMap);
 
私のxmlは次のとおりです.
 
<!-- select sql -->

  <select id="queryEntities"

    parameterClass="java.util.HashMap"

    resultClass="EntityClass"

    resultMap="EntityClassResultMapDefault">

    <![CDATA[

      SELECT * FROM 

    ]]>



    <dynamic prepend="WHERE">

      <isNotEmpty prepend="AND" property="param.itemid">

      <![CDATA[

        (itemid = #param.itemid:VARCHAR#)

      ]]>

      </isNotEmpty>

      <isNotEmpty prepend="AND" property="param.brandname">

      <![CDATA[

        (brandname like #param.brandname:VARCHAR#)

      ]]>

      </isNotEmpty>

    </dynamic>

      <dynamic prepend="LIMIT">

        <isNotEmpty property="limit" >

        <![CDATA[

            #limit:INTEGER#

        ]]>

      </isNotEmpty>

    </dynamic>

    <dynamic prepend="OFFSET">

      <isNotEmpty property="offset" >

      <![CDATA[

          #offset:INTEGER#

      ]]>

      </isNotEmpty>

    </dynamic>

  </select>



  <select id="getRowCount"

    parameterClass="java.util.HashMap"

    resultClass="java.lang.Long">

    <![CDATA[

      SELECT COUNT(*) FROM ent_table

    ]]>



    <dynamic prepend="WHERE">

      <isNotEmpty prepend="AND" property="param.itemid">

      <![CDATA[

        (itemid = #param.itemid:VARCHAR#)

      ]]>

      </isNotEmpty>

      <isNotEmpty prepend="AND" property="param.brandname">

      <![CDATA[

        (brandname like #param.brandname:VARCHAR#)

      ]]>

      </isNotEmpty>

    </dynamic>

  </select>

 
したがって、コードでは、queryEntitiesを最初に実行する前に、getRowCountを実行して記録数を取得する必要がある.一方queryEntitiesはSELECT*FROM table WHERE condition LIMIT m OFFSET n構文を採用するため、n個の結果記録(0-based)を自動的にスキップし、m個を超えない記録を返す.これはデータベースのサポートが必要です.MySQL、Sqliteはできます.なお、OFFSET nは、戻る結果セットでスキップ前のn個である.
以上は簡単なiBATIS物理ページングの実現であり、明らかにページをめくるたびにクエリーを実行するが、LIMITレコードしか取得しないため、サーバのメモリ消費は固定的な小サイズである.これは、大きなレコードセットを参照するのに特に有用である.