MySQL 방법으로
select bno, title, writer, regdate, updatedate
from vam_board order by bno desc
limit 5, 5;
limit 5, 5; = limit skip, count (앞에 5개를 건너띄고 5개를 select)
ex) 게시글이 6개일땐 앞에 5개를 skip 후 1개밖에 없으니 1개만 보여짐.
* pageNum : 현재페이지
* amount : 해당페이지의 게시글 수
limit skip, count → limit pageNum-1 * amount , amount
보여지는 게시글이 10개라면
limit pageNum-1 * amount , amount
1 페이지 => 0,10
2 페이지 => 10,10
3 페이지 => 20,10
Criteria 클래스를 생성해서 pageNum, amount 데이터 적기.
*skip 계산도 적기
public class Criteria {
/* 현재 페이지 */
private int pageNum;
/* 한 페이지 당 보여질 게시물 갯수 */
private int amount;
/* 스킵할 게시물 수 ( pageNum-1 * amount )*/
private int skip;
/* 기본 생성자 -> 기본세팅 pageNum=1, amount=10 */
public Criteria() {
this(1,10); // 전체 생성자를 통해 (1,10)을 입력되어 객체 생성
}
/* 생성자 -> 원하는pageNum, amount */
public Criteria(int pageNum, int amount) {
this.pageNum = pageNum;
this.amount = amount;
this.skip = pageNum-1 * amount;
}
}
겟터 셋터도 설정한다 (set에 스킵 계산 추가적기 )
public int getPageNum() {
return pageNum;
}
//새로 페이지 숫자를 설정 했을때 -> 스킵도 계산
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
this.skip = pageNum-1 * this.amount;
}
public int getAmount() {
return amount;
}
//페이지당 갯수를 바꿀경우에도 스킵을 다시 계산
public void setAmount(int amount) {
this.amount = amount;
this.skip = (this.pageNum-1) * amount;
}
public int getSkip() {
return skip;
}
public void setSkip(int skip) {
this.skip = skip;
}
*this. 잘붙이기
마지막 toString() 메서드까지
@Override
public String toString() {
return "Criteria [pageNum=" + pageNum + ", amount=" + amount + ", skip=" + skip + "]";
}
페이지 적용은 RecipeMapper
/* 게시판 목록 (페이지 적용): pageNum, amount를 입력받고 객체criteria 생성 없으면 기본(1,10)*/
public List<RecipeVO> getListPaging(Criteria criteria);
RecipeMapper.xml
<!-- MySQL-->
<!-- 게시물 목록(페이징) -->
<select id="getListPaging" resultType="RecipeVO">
select * from (
select id, title, writer, regdate, updatedate
from recipe
order by id desc) as T1 -> 내림차순
limit #{skip}, #{amount}
</select>
#{skip}, #{amount} 는 getListPaging(Criteria criteria); 의 criteria객체에서 받아옴.
* as T1 안적으면 오류남.
SQL에 데이터 초기화 하고 100개 입력하는 데이터 만들기 (# 한글 적으면 실행안됨)
TRUNCATE TABLE recipe;
DELIMITER $$
DROP PROCEDURE IF EXISTS procedureName$$
CREATE PROCEDURE procedureName()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 100 DO
INSERT INTO recipe(title , content, writer, ingredient, registerdate, updateDate)
VALUES( concat('제목',i), '테스트 데이터 에요', '작가', '재료', now(), now());
SET i = i + 1;
END WHILE;
END$$
DELIMITER $$
CALL procedureName;
*TRUCATE TABLE하면 데이터 날아감.
Mapper 테스트 하기
Criteria criteria = new Criteria(); //기본생성자 (1,10)
List<RecipeVO> list = recipeMapper.getListPaging(criteria);
list.forEach(board -> log.info("" + board));
오류
llimit ?,? 이 뜨는데
기본생성자에 skip 기본 설정해줘야함.
public Criteria() {
this(1,10); // 전체 생성자를 통해 (1,10)을 입력되어 객체 생성
this.skip = 0;
}
현재 1페이지 10개 게시글
criteria.setPageNum(2); 추가하면 2페이지부터 10개까지
Criteria criteria = new Criteria(); //기본생성자 (1,10)
criteria.setPageNum(2);
List<RecipeVO> list = recipeMapper.getListPaging(criteria);
list.forEach(board → log.info("" + board));
++
criteria.setPageNum(2);
criteria.setAmount(4)
를 추가하면 2페이지~ 4개 게시글
RecipeService = RecipeMapper
public List<RecipeVO> getListPaging(Criteria criteria);
RecipeServiceImpl
@Override
public List<RecipeVO> getListPaging(Criteria criteria) {
return recipeMapper.getListPaging(criteria);
}
controller
기존의 게시글 get매핑 지우고 페이징되는 걸로 다시 수정
@GetMapping("/list")
public String recipeListGet(Model model, Criteria criteria) {
//boardList에 페이징 된 게시글을 전달
model.addAttribute("boardList", recipeService.getListPaging(criteria));
return "recipe_list";
}
* @RequestParam를 적으면 무조건 받아야하지만 (int i) 만 적으면 파라미터로 받지만 없어도 상관없다
= pageNum, amount 두개가 필요하지만 안적어도 기본생성자(1,10) 값이 들어가고
원하는 페이지와 게시글 수를 얻고싶다면 pageNum, amount를 파라미터로 적는다.
파라미터로 직접 http://localhost:8080/recipe/board/list?pageNum=2&amount=5 쓰면
→ 2페이지부터 5개 게시글만 나온다.
'Spring boot | 쇼핑몰 만들기 | 어글리 마켓 > 홈페이지 만들기 | 고객,관리자' 카테고리의 다른 글
[레시피] 검색 기능 구현하기 (0) | 2022.05.17 |
---|---|
[레시피] 게시판 페이지네이션 view (0) | 2022.05.17 |
[레시피] 게시글 삭제 기능 (0) | 2022.05.17 |
[레시피]게시판 글 수정 기능 (0) | 2022.05.17 |
장바구니 결제하기 (0) | 2022.05.12 |