GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Mybatis

[Mybatis] Paging처리

Backcoder 2022. 8. 22. 22:42

[[ 페이징 처리 ]]


[ foreach SQL ]
- 먼저 SQL.xml 파일에서 반복문을 사용하는 법을 익혀야 한다.


- SQL 문의 #{?} 변수값으로 배열 등의 복수개의 데이터가 들어갈 경우,
그 여러개의 데이터들을 SQL문에 , 쉼표 로 구분 하면서 하나하나 반복되며 집어넣어서
그 결과로 ?, ?, ? 같은 모양새를 가진 SQL 문 하나를 완성시킬 수 있다.

[ 자바 ]
session.selectList ("key", new int[ ]{100,200,300,400} );
=>
select * from emp where id in
<foreach items="array" separartor = "," var = "id" >
#{ id }

- items : 뽑아낼 배열 등의 복수 객체
- separator : 구분자
=> 반복문결과를 a1, a2, a3 쉼표로 구분해줘
( SQL문에서는 거진 , 쉼표로 다 구분하니까 거의 쉼표로 사용하면 된다 )
- var : items 하나하나 뽑아낸거 id 라는 이름의 변수에 담아줘


=> SQL 의 변수명 #{ id } 에 자동매칭 되면서 var 이 반복되며 들어간다

결과 :
select * from member where id in ( 100, 200, 300, 400 );  

그럼 이 반복문 사용법을 이용해서 페이징 처리를 해보자.

[ 페이징 처리 ]
: MySQL 의 limit 을 사용한다. ( MySQL 전용이다. 다른 DB 에선 사용할 수 없다. )

select * from servletmember order by id limit X , Y
: 조회할건데, X 번째 index 부터, Y 개만 조회해줘.

select * from servletmember order by id limit 0, 4
: 0~3번째 index 조회 => 1page
select * from servletmember order by id limit 4, 4
: 4~7번째 index 조회 => 2page
select * from servletmember order by id limit 8, 4
: 8~11번째 index 조회 => 3page
....

이런식으로 페이지를 만들어 간다.
limit 에는 {0,4} , {4,4} , {8,4} .... 와 같이 2개의 숫자로 이루어진 배열이 변수로 들어가야 한다.
두개의 배열을 foreach 반복문으로 , 쉼표로 구분하면서 주면 된다.

1. SQL 문

<select id="paginglist" resultType="memberdto" >
select * from servletmember order by id limit
<foreach collection="array" item="num" separator=",">
#{num}
</foreach>
</select>


: array 타입 #{num} 이 들어오면 , 쉼표로 구분하면서 SQL문 완성하겠다.

int[ ] page1 = {0, 4};
=> select * from servletmember order by id limit 0, 4

int[ ] page2 = {4, 4};
=> select * from servletmember order by id limit 4, 4
...

- 배열이 들어가면 저렇게 해당 데이터만 가져오는건 알겠는데
그럼 어떻게 {0, 4} {4, 4} {8, 4} ... 배열을 보낼까?


2. Mapping 파라미터 사용

(1) 자바 Controller
@GetMapping("/pagememberlist")
public String memberlist
(@RequestParam( name="page", required = false,  defaultValue = "1" ) int page, Model model) { }

: memberlist 라는 맵핑 메소드는 @RequestParam을 사용해서

=> URL에 직접 파라미터를 집어넣겠다.
=> name=page라는 변수명으로 집어넣을거고, 필수(required)는 아니다.

=> value값은 default 1 로 설정해두겠다. ( 처음에 ?page=1  로 잡아서 1페이지를 띄우기 위해 ) 

즉, URL 값은 기본 http://localhost:8090/pagememberlist 에서
http://localhost:8090/test/pagememberlist?page=1
이렇게 직접 파라미터를 받아오는 URL을 갖게 되고,
이 URL이 @GetMapping으로 사용되기 때문에
http://localhost:8090/test/pagememberlist?page=2
http://localhost:8090/test/pagememberlist?page=3
http://localhost:8090/test/pagememberlist?page=4 . . .
이런 모양새의 URL요청은 이 @GetMapping 메소드로 다 받을 수 있게 된다.

(2) VIEW(jsp) 페이지에서 요청

for (int i = 1; i<= totalpage; i++) {
<a href = "pagememberlist?page = i"> i </a> }

: 총 페이지 수 만큼,
pagememberlist?page = 1
pagememberlist?page = 2
pagememberlist?page = 3 ...
링크를 가진 URL 로 페이지 링크를 걸어둔다.

1 2 3 4 5

=> 이 페이지 링크를 누르면,

@GetMapping("/pagememberlist")
public String memberlist

(@RequestParam(value="page", required = false, defaultValue = "1") int page )

이 맵핑에서 받고, 해당 ?page = X URL에서 X 값을 받아서 int page 로 집어 넣는다.

=> 이 페이지 숫자 1, 2 ,3 4, 5 를 이용하면
List<memberDTO> memberlist = service.paginglist(new int[ ] { (page-1)*4, 4 })

누르는 페이지 번호 ( 1, 2, 3 .. ) => URL 에서 page 로 받아서
=> (page-1)*4 ,4 =>  {0,4} {4,4} {8,4} ...
해당 페이지에서 조회할 limit 값을 만들 수 있다.



[ controller ]
@GetMapping("/pagememberlist")
public String memberlist
(@RequestParam(value="page", required = false, defaultValue = "1")int page, Model model) throws IOException {


int totalnum = service.getTotalMember();
int totalpage = 0;
if(totalnum%4==0){
totalpage = totalnum/4;
}else{
totalpage =totalnum/4 + 1;
}

List<memberDTO> memberlist = service.paginglist(new int[] {(page-1)*4, 4});

model.addAttribute("memberlist", memberlist);
model.addAttribute("totalpage", totalpage);

return "/MVC/pagememberlist";
}



[ View ]

<c:forEach items="${memberlist}" var="dto" >
<tr>
<td>${dto.id}</td>
<td>${dto.name}</td>
</tr>
</c:forEach>

<%

int totalpage = (Integer)request.getAttribute("totalpage");

for(int i = 1; i<=totalpage; i++){ %>
<a href="pagememberlist?page=<%=i%>"> <%=i%></a>
<%}%>

'Back to the Mybatis' 카테고리의 다른 글

[Mybatis] 검색처리 SQL  (0) 2022.08.22
[Mybatis] + [Spring] 연동 순서  (0) 2022.08.22
[Mybatis] 사용법  (0) 2022.08.22