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は次のとおりです.
したがって、コードでは、queryEntitiesを最初に実行する前に、getRowCountを実行して記録数を取得する必要がある.一方queryEntitiesはSELECT*FROM table WHERE condition LIMIT m OFFSET n構文を採用するため、n個の結果記録(0-based)を自動的にスキップし、m個を超えない記録を返す.これはデータベースのサポートが必要です.MySQL、Sqliteはできます.なお、OFFSET nは、戻る結果セットでスキップ前のn個である.
以上は簡単なiBATIS物理ページングの実現であり、明らかにページをめくるたびにクエリーを実行するが、LIMITレコードしか取得しないため、サーバのメモリ消費は固定的な小サイズである.これは、大きなレコードセットを参照するのに特に有用である.
cheungmine 2013-8-26
SSI(Struts 2,Spring 3,iBATIS 2.3)フレームワークを用いてWebサービスを開発する際に必要なのは,クエリの結果をページごとに表示することである.iBATIS 2のクエリ関数は、主にqueryForListとqueryForPaginatedListがあります.
queryForPaginatedListは、データ量が大きくなると性能が急激に低下、まったく使用できないほど、直接ページ分けできるという.
queryForListに戻り、以下の呼び出しでqueryEntitiesのすべてのデータを取得できます.
List
レコードの合計数を知る必要がある場合は、次の手順に従います.
List
私の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レコードしか取得しないため、サーバのメモリ消費は固定的な小サイズである.これは、大きなレコードセットを参照するのに特に有用である.