0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

明細1行に複数のレコードを取得している場合のページ切り替えを考える

0
Posted at

はじめまして。主にエンハンスで活動しております。
今回はフレームワークにMyBaisを用いたWebページの話です。

既存の画面にも明細1行に複数行のレコード情報を取得しているページはあったのですが、せっかくのMyBatisですから、一度に複数のレコードを取得したいと思い、200行くらいのレコードをMyBatisの機能で1オブジェクトに変換しました。200行が1オブジェクトになるんですよ。1オブジェクトの中にListがあって、それが10サイズのリストになっていて、さらにListを含んでいる。そういうオブジェクトがMyBatisのresultMapでできちゃうんですから驚きです。
画面にも、200オブジェクトではなく1オブジェクトとして送られてくるので、1行分です。嬉しいですね。
ここで、明細エリアの説明をしたいと思います。明細エリアにはページ切り替えがついていて、1ページの表示件数は10件です。DB上では200行取得できていましても、行数としては1行分にあたりますので、ページ切り替えは発生しません。ところが、崩れました。ページ切り替えの部品が。

ページ切り替えのオブジェクトはPageDtoというものを使っていまして、中身はこんな感じです。

PageDto.java

/** 件数 */
private Integer count;
/** 表示している明細の開始行数 */
private Integer indexFrom;
/** 表示している明細の終了行数 */
private Integer indexTo;
/** 表示している明細欄の次ページ */
private Integer indexNext;
/** 表示している明細欄の前ページ */
private Integer indexPrev;
/** 表示している明細欄の最終ページ */
private Integer indexMax;

今回は、1行が複数レコードで構成されるので、それが原因だろうと考え、このPageDtoにステップ数を追加しようと思いました。ただし、その改修方法ですと、既存のPageDtoにも影響が出るため、試験範囲を広げなければなりません。
そこで、このPageDtoに値を設定する共通サービスを修正することにしました。それでは、その共通サービスを見てみましょう。

PageService.java

public PageDto createPageDto(int pageCnt, int current, int count) {
    PageDto page = new PageDto;
    page.setCount(count);
    int max = Mah.ceil(count / pageCnt);
    page.setIndexMax(max);
    page.setIndexNext(current + 1 > max ? max : current + 1);
    page.setIndexPrev(current - 1 > 1 ? current - 1 : 1);
    page.setIndexTo(current * pageCnt > max ? max : current * pageCnt);
    return page;
}

実際はこんな風に三項演算子なんかは使われていないですけど、記事を読むにはシンプルでわかりやすいと思いましたので使用しました。既存のPageDtoについて理解するのに、ここまでで2時間以上、費やしてしまった気がします。最初から、JSPの方でどのように見ればすぐわかったのに、Javaの設定方法やJUnitのケースを見たり、遠回りしてしまいました。

ということで、今回の改修案です。

PageService.java

public PageDto createPageDto(int pageCnt, int current, int cnt, int stepCnt) {
    PageDto page = new PageDto;
    int count = cnt / stepCnt;
    page.setCount(count);
    int max = Mah.ceil(count / pageCnt);
    page.setIndexMax(max);
    page.setIndexNext(current + 1 > max ? max : current + 1);
    page.setIndexPrev(current - 1 > 1 ? current - 1 : 1);
    page.setIndexTo(current * pageCnt > max ? max : current * pageCnt);
    return page;
}

引数が異なるので、既存のメソッドにも修正が入らないし、安心ですね。JUnitがあるので、既存のメソッドから↓下のように呼び出しても良いのですが、今回のお客様との距離感を考えるとやらないですね。

PageService.java

/** 既存のメソッドから新規メソッドを呼び出す */
public PageDto createPageDto(int pageCnt, int current, int count) {
    return createPageDto(pageCnt, current, count, 1);
}

以上です。最後まで、ご覧いただきありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?