iBatisには、ページング機能付きのリストを取得する機能があります。
com.ibatis.common.util.PaginatedList
このインターフェースは、Listインターフェースを継承しており、
Listのメソッドに加え、以下のようなページングのメソッドを提供しています。
- getPageIndex()
- getPageSize()
- isFirstPage()
- isLastPage()
- isMiddlePage()
- isNextPageAvailable()
- isPreviousPageAvailable()
- nextPage()
- previousPage()
どのメソッドも見たままの動作を提供します。
以下、サンプルです。
[SqlMap設定ファイル]
<?xml version="1.0" encoding="Windows-31J"?> <!-- vim:set ts=4 sw=4 et ws is nowrap ft=xml: --> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap namespace="PaginatedList"> <typeAlias alias="PaginatedListData" type="gsf.samples.ibatis.sample006.PaginatedListData"/> <select id="getPaginatedListData" resultClass="PaginatedListData"> select id ,name from test order by id </select> </sqlMap>
[データクラス]
// vim:set ts=4 sw=4 et ws is nowrap ft=java: package gsf.samples.ibatis.sample006; import java.io.*; import org.apache.commons.lang.builder.*; /** * PaginatedListのサンプル用のデータクラス.<br/> * TESTテーブルと対応する.<br/> * * @author gsf_zero1 * */ public class PaginatedListData implements Serializable{ /** ID */ private Integer id; /** NAME */ private String name; /** * Get id. * * @return id as Integer. */ public Integer getId(){ return this.id; } /** * Set id. * * @param id the value to set. */ public void setId(Integer id){ this.id = id; } /** * Get name. * * @return name as String. */ public String getName(){ return this.name; } /** * Set name. * * @param name the value to set. */ public void setName(String name){ this.name = name; } @Override public String toString(){ return new ReflectionToStringBuilder(this).toString(); } }
[サンプルクラス]
// vim:set ts=4 sw=4 et ws is nowrap ft=java: package gsf.samples.ibatis.sample006; import java.sql.*; import java.util.*; import gsf.utils.sqlmap.*; import com.ibatis.common.util.*; import com.ibatis.sqlmap.client.*; /** * Sample006の動作確認を行うクラス.<br/> * * @author gsf_zero1 * */ public class IBatisSample006{ /** * SqlMapの実行を行うインナークラス.<br/> * * @author gsf_zero1 * */ class IBatisSample006SqlMapExecutor{ /** ページサイズ */ private final int pageSize = 10; /** * 処理を実行する.<br/> * * @param sqlMap SqlMapClientオブジェクト * * @return ページング機能付きリスト * * @throws SQLException SQL処理中にエラーが発生した場合 * */ public PaginatedList execute(SqlMapClient sqlMap) throws SQLException{ return sqlMap.queryForPaginatedList("getPaginatedListData", null, pageSize); } } /** * PaginatedListの現在の状態を表示する.<br/> * * @param paginatedList ページング機能付きリスト * */ private void printPaginatedListStatus(PaginatedList paginatedList){ System.out.printf("pageIndex : %d\n", paginatedList.getPageIndex()); System.out.printf("pageSize : %d\n", paginatedList.getPageSize()); System.out.printf("isFirstPage : %s\n", paginatedList.isFirstPage()); System.out.printf("isLastPage : %s\n", paginatedList.isLastPage()); System.out.printf("isMiddlePage : %s\n", paginatedList.isMiddlePage()); System.out.printf("isNextPageAvailable : %s\n", paginatedList.isNextPageAvailable()); System.out.printf("isPreviousPageAvailable : %s\n", paginatedList.isPreviousPageAvailable()); for(PaginatedListData data : (List<PaginatedListData>) paginatedList){ System.out.println(data); } } /** * サンプル処理を実行.<br/> * */ public void executeSample(){ PaginatedList paginatedList = (PaginatedList) SqlMapUtils.executeNoTransaction(new IBatisSample006SqlMapExecutor(), "execute"); printPaginatedListStatus(paginatedList); if(paginatedList.isNextPageAvailable()){ paginatedList.nextPage(); } printPaginatedListStatus(paginatedList); if(paginatedList.isNextPageAvailable()){ paginatedList.nextPage(); } printPaginatedListStatus(paginatedList); paginatedList.previousPage(); printPaginatedListStatus(paginatedList); paginatedList.gotoPage(10); printPaginatedListStatus(paginatedList); } /** * アプリケーションエントリーポイント<br/> * * @param args 起動時引数 * */ public static void main(String[] args){ new IBatisSample006().executeSample(); } }
実行すると、ページサイズ分のデータのみが一回分に取得されていることがわかります。
PaginatedListは、ページ移動メソッドが呼ばれると次のページ分を取得するために、
SQLを発行します。(queryForList(String, Object, int, int)が呼ばれてます)
なお、PaginatedList自身は、インターフェースとなっており、PaginatedArrayListが
実装クラスとなっています。
以下、参考リソースです。