ページング機能

iBATIS1-3-1にはPaginagedListというページング機能専用のListがあった。
これはListを継承したものであり、以下のメソッドが追加されている。

  public int getPageSize();
  public boolean isFirstPage();
  public boolean isMiddlePage();
  public boolean isLastPage();
  public boolean isNextPageAvailable();
  public boolean isPreviousPageAvailable();
  public boolean nextPage();
  public boolean previousPage();
  public void gotoPage(int pageNumber);
  public int getPageIndex();

使い方としては

  //PaginatedList取得。
  PaginatedList list = sqlMap.executeQueryForPaginatedList("getInfo", param, size);

  for (int i = 0; i < list.size(); i++) {
    Info info = (Info) list.get(i);
    //何か処理を行う。
  }

  //....ユーザーが次のページのデータを要求。

  //次のページのデータ取得。
  list.nextPage();

  for (int i = 0; i < list.size(); i++) {
    Info info = (Info) list.get(i);
    //何か処理を行う。
  }

見たいな感じで、listのnextPage()とかpreviousPage()とか呼ぶと
最初にPaginatedListを取得するときに指定したsizeが一ページのサイズとして
次のページとか前のページのデータが取得できる。
WebアプリケーションではこのPaginatedListをセッションなどに入れておき
次のページを表示する必要がればこのPaginatedListのnextPage()メソッドを呼べば
iBATISが内部的にSQL文を発行し次のページの情報を取得して来てくれる。

この機能は確かに優れているけど直接15件目から35件までのデータを取得したい場合には都合がよろしくない。
PaginatedListはインターフェースで実際使われているPaginatedDataListというクラスにはgotoPage(int)メソッドがあり
ページ数移動が可能だがPaginateDataListはコンストラクタで一回SQL文を必ず発行する。
そこからgotoPage(5)とかやって5ページ目のデータを取得するともう一回SQL文が発行される。
それに移動指定もページ指定のみで使い勝手がいいとはいえない。

なんで開始位置、取得件数指定のAPIが無いんだ〜と思って2-0-0-159 beta5を落として調べてみると

  sqlMap.queryForList("getInfo", param, skip, size)

そのものずばりなAPIが追加されていた。