いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

iBatis奮闘記-0008 (ページング機能付きのリストの取得(PaginatedList))

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が
実装クラスとなっています。

以下、参考リソースです。