4月19日
30063 ワード
きょう習った
ページング(1)
DBMSアプリケーションの種類が異なります
Oracle
モードすべてのデータを検索し、指定した範囲のデータのみを選択します.
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
数字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
ページングの適用
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 + "]";
}
}
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;
}
}
// pageNum , amount를 입력받아 개체 cri생성, 없으면 기본 (1,10)입력
public List<BoardVO> getListPaging(Criteria cri); // 게시판 모든 글 불러오기(페이징 적용)
public int getTotal(); // 게시글 총 갯수
@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)
<!-- 페이지네이션-->
<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>
Reference
この問題について(4月19日), 我々は、より多くの情報をここで見つけました https://velog.io/@tutu10000/4월-19일テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol