MyBatis paging

EUNJI LEE·2023년 7월 10일
0

MyBatis

목록 보기
3/6
post-custom-banner

MyBatis에서 paging 처리

MyBatis에서 페이징 처리를 하기 위해서는 RowBounds 객체를 사용한다. DB에 접근해서 페이지에 가져올 갯수를 지정할 때 RowBounds 객체에 시작 페이지 숫자와 출력할 게시글 갯수를 매개변수로 넘겨서 RowBounds 객체를 생성할 수 있다.

paging 처리하는 공식은 고정이므로 외워서 사용한다. 아래 코드는 서블릿에서 게시글 리스트를 출력할 때 10개씩 출력되도록 페이징 처리한 doGet() 메소드이다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		int cPage,numPerpage;
		try {
			cPage=Integer.parseInt(request.getParameter("cPage"));
		}catch(Exception e) {
			cPage=1;
		}
		numPerpage=10;
		List<Student> list=new StudentService().selectStudentPage(cPage,numPerpage);
//		System.out.println(list.size());
//		list.stream().forEach(System.out::println);
		request.setAttribute("students", list);
		
		int totalData=new StudentService().selectStudentCount();
		int totalPage=(int)Math.ceil((double)totalData/numPerpage);
		int pageBarSize=5;
		int pageNo=((cPage-1)/pageBarSize)*pageBarSize+1;
		int pageEnd=pageNo+pageBarSize-1;
		
//출력될 페이지바 html 코드로 작성해서 넘기기
		String pageBar="<ul class='pagination justify-content pagination-sm'>";
		if(pageNo==1) {
			//15버전 이상일때만 " 3개를 사용해서 문자열 작성 가능함
			//부트스트랩 사용 예정으로 클래스를 지정해주었다.
			pageBar+="""
					<li class='page-item disabled'>
					<a class='page-link' href='#'>이전</a>
					</li>
					""";
		}else {
			pageBar+="<li class='page-item'>";
			pageBar+="<a class='page-link' href='"+request.getRequestURI()+"?cPage="+(pageNo-1)+"'>이전</a></li>";
		}
		
		while(!(pageNo>pageEnd||pageNo>totalPage)) {
			if(cPage==pageNo) {
				pageBar+="<li class='page-item disabled'>";
				pageBar+="<a class='page-link' href='#'>"+pageNo+"</a></li>";
			}else {
				pageBar+="<li class='page-item'>";
				pageBar+="<a class='page-link' href='"+request.getRequestURI()+"?cPage="+(pageNo)+"'>"+pageNo+"</a></li>";
			}
			pageNo++;
		}
		
		if(pageNo>totalPage) {
			pageBar+="""
					<li class='page-item disabled'>
					<a class='page-link' href='#'>다음</a>
					</li>
					""";
		}else {
			pageBar+="<li class='page-item'>";
			pageBar+="<a class='page-link' href='"+request.getRequestURI()+"?cPage="+(pageNo+1)+"'>다음</a></li>";
		}
		pageBar+="</ul>";
		request.setAttribute("pageBar", pageBar);
		request.getRequestDispatcher("/views/studentPage.jsp").forward(request, response);
	}

아래 코드는 DB에 접근해서 sql문을 실행하는 DAO에서 RowBounds 객체를 넘겨주는 코드이다.

selectList() 호출 시 세번째 매개변수에 RowBounds 클래스를 생성해서 전달해준다. 먼저 매개변수 있는 생성자를 이용해서 객체 생성하고 첫번째 매개변수로 시작 번호를 넘겨준다.

시작 번호 공식은 다음과 같다. (cPage-1)*numPerpage
두번째 매개변수로 출력될 범위를 넘겨준다. numPerpage

💡 이때, selectList() 메소드 실행 시 매개변수 순서를 맞추는데 주의한다. 리스트 전체를 출력하기 때문에 페이징처리 할 RowBounds 객체 외에 넘길 매개변수가 없다고 하더라도 매개변수 위치를 맞춰주어야 원하는 값으로 제대로 받아올 수 있다.

public List<Student> selectStudentPage(SqlSession session, int cPage, int numPerpage) {
		RowBounds rb=new RowBounds((cPage-1)*numPerpage, numPerpage);
		return session.selectList("student.selectStudentPage", null, rb);
		//매개변수 순서 맞춰야함
	}
profile
천천히 기록해보는 비비로그
post-custom-banner

0개의 댓글