[[ 페이징 처리 ]]
[ 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 |