ページング機能
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が追加されていた。