4月19日

30063 ワード

きょう習った

  • ページング(1)
  • ページング(1)


    DBMSアプリケーションの種類が異なります

    Oracle

  • oracleの場合、仮想Column rownumを作成することによってページングを作成できます.
  • rownumは、行ごとに順番に番号を付ける機能
  • を提供する.
    モードすべてのデータを検索し、指定した範囲のデータのみを選択します.
    select * 
    from(
            select rownum as rn, bno, title, content, writer, regdate, updatedate
            from board 
        )
    where rn between 11 and 20
    
    モードデータの一部のみを検索し、他の範囲を指定します.
    select * 
    from(
            select  rownum  as rn, bno, title, content, writer, regdate, updatedate 
            from board where rn <= 20
        ) 
    where rn > 11;

    1の方式よりも2の方式の方が実行速度が速い.

    MySql

  • 制限方法は、所望範囲のデータ
  • のみを出力.
  • limit数字1、数字2=>
    数字1は、一番上のデータからスキップする行数を表します.
    数字2は、skipが終了した行から出力される行数を示す.
    例えばlimit 10,10の場合、10行をスキップする、11行目から10行目、すなわち20行目
  • を選択する.
            select * 
            from (
                    select bno, title, writer, regdate, updatedate  
                    from vam_board order by bno desc
                 ) as T1 
            limit 숫자1, 숫자2

    注意(rownumデフォルト)


    https://wakestand.tistory.com/244

    ページングの適用

  • MySQLを使用しているため、制限方法
  • を使用しています.
  • ページの計算を生成するCriteriaクラス
  • package com.myapp.bbs.model;
    
    /**
     * 페이지 계산을 위한 클래스
     * 
     *
     */
    public class Criteria {
    
    	private int pageNum; // 현재 페이지
    	
    	private int amount; // 한 페이지당 보여질 게시글 수
    
    	private int skip; // 스킵할 페이지 수 ((pageNum -1) * amount)
    	
    	public Criteria() { // 기본 생성자 -> 기본 세팅: pageNum = 1; amount = 10 
    		this(1,10); // 전체 생성자를 통해 (1,10)을 입력해 객체 생성 -> Criteria(1,10)
    	}
    	
    	public Criteria(int pageNum, int amount) {
    		this.pageNum = pageNum;
    		this.amount = amount;
    		this.skip = (pageNum - 1) * amount;
    	}
    
    	public int getPageNum() {
    		return pageNum;
    	}
    
    	// 새로 페이지 숫자를 설정 했을 때 skip도 같이 계산하여 입력
    	public void setPageNum(int pageNum) {
    		this.pageNum = pageNum;
    		this.skip = (pageNum - 1) * amount;
    	}
    
    	public int getAmount() {
    		return amount;
    	}
    
    	// 페이지당 보여질 게시글 수를 새로 설정 했을 때 skip도 같이 계산하여 입력
    	public void setAmount(int amount) {
    		this.amount = amount;
    		this.skip = (pageNum - 1) * amount;
    	}
    
    	public int getSkip() {
    		return skip;
    	}
    
    	public void setSkip(int skip) {
    		this.skip = skip;
    	}
    
    	@Override
    	public String toString() {
    		return "Criteria [pageNum=" + pageNum + ", amount=" + amount + ", skip=" + skip + "]";
    	}
    }
  • ページに名前を付けてPageMackerdDOクラス
  • を作成
  • エラーを使用してceil(アップロード)をアップロードするのは、ページにデータを出力するためであり、残りのデータがある場合は、次のページ:
  • を無条件に作成するためである.
    package com.myapp.bbs.model;
    
    import lombok.Data;
    
    /**
     * 페이지 네이션을 위해서 전체게시물 수와 cri를 입력받아 계산하여
     * 시작페이지, 끝페이지, 이전,다음페이지 유무를 저장
     * 
     *
     */
    @Data
    public class PageMakerDTO {
    	
    	// 시작 페이지(현재페이지)
    	private int startPage;
    	
    	// 마지막 페이지
    	private int endPage;
    	
    	// 이전페이지, 다음페이지 유무
    	private boolean prev, next;
    	
    	// 전체 게시글 수
    	private int total;
    	
    	// 현재 페이지, 페이지당 게시글 출력 수 정보
    	private Criteria cri;
    
    	public PageMakerDTO(int total, Criteria cri) {
    		this.total = total;
    		this.cri = cri;
    		
    		// 마지막 페이지 : 10 단위로 표시 1~10, 11~20, 21~30, ceil은 올림
    		// 현재 페이지가 1이면 끝페이지는 10, 11이면 끝페이지는 20
    		this.endPage = (int)(Math.ceil(cri.getPageNum()/10.0)) * 10;
    		
    		// 시작페이지
    		this.startPage = this.endPage - 9;
    		
    		// 실제 마지막 페이지
    		int realend = (int)(Math.ceil(total * 1.0/cri.getAmount()));
    		
    		// 실제 마지막 페이지(realend)가 화면에 보이는 마지막페이지(endPage)보다 작은경우, endPage값을 조정
    		if(realend < this.endPage) {
    			realend = this.endPage;
    		}
    		
    		// < 이전페이지가 true이려면 시작 페이지(startPage)값이 1보다 큰 경우 true
    		this.prev = this.startPage > 1;
    		
    		// > 다음페이지가 true이려면 마지막 페이지(endPage)값이 realend값보다 작은 경우 true
    		this.next= this.endPage < realend;
    	}
    }
  • Mapper、Serviceに
  • と入力
    	// pageNum , amount를 입력받아 개체 cri생성, 없으면 기본 (1,10)입력
    	public List<BoardVO> getListPaging(Criteria cri); // 게시판 모든 글 불러오기(페이징 적용)
        
        public int getTotal(); // 게시글 총 갯수
  • コントローラのすべてのパブリケーション文書出力方法
  • を変更する
  • @ModelAttributeは省略可能である、パラメータ内にあるオブジェクトの変数
  • は自動入力される.
    	@GetMapping("/list")
    	public String boardListGet(Criteria cri, Model model) {
    		log.info("게시판 리스트 페이지 진입");
    		model.addAttribute("boardList", boardService.getListPaging(cri));
    		
    		int total = boardService.getTotal();
    		PageMakerDTO pmk = new PageMakerDTO(total, cri);
    		model.addAttribute("pmk", pmk);
    		
    		return "list";
    	}

    ページ(1)

  • th:if,pmk.
  • 、endPageが0未満の場合は表示されません
  • th:each繰返し出力
  • ページ
                <!-- 페이지네이션-->
                <nav aria-label="Page navigation" th:if="${pmk.endPage > 0}">
                  <ul class="pagination">
                    <li class="page-item">
                      <a class="page-link" href="javascript:;" aria-label="이전">
                        <span class="material-icons">
                          keyboard_arrow_left
                        </span>
                        <span class="sr-only">Previous</span>
                      </a>
                    </li>
                    <li class="page-item" th:each="number : ${#numbers.sequence(1,pmk.endPage)}">
                      <a class="page-link" href="javascript:;" th:text="${number}"></a>
                    </li>
                    
                    <li class="page-item">
                      <a class="page-link" href="javascript:;" aria-label="다음">
                        <span class="material-icons">
                          keyboard_arrow_right
                        </span>
                        <span class="sr-only">Next</span>
                      </a>
                    </li>
                  </ul>
                </nav>