MyBatis 페이징 처리

최주영·2023년 7월 9일
0

MyBatis

목록 보기
5/8

✅ 두번의 쿼리문 작업이 필요

  • cPage = 현재 사용자가 보고 있는 페이지

  • numPerPage = 한 페이지당 나타낼 자료의 갯수

  • totalMember = 현재 디비에 등록된 총 회원 수

  • totalPage = (총 회원수/한 페이지당 나타낼 회원 수)의 총 갯수, ex) 10명/2개씩 -> 총 5페이지
    (int)Math.ceil((double)totalData/numPerpage)

  • pageBar = html 코드를 넣어줄 변수 (실질적인 페이지바 화면)

  • pageBarSize = 아래 사진과 같은건데 1~5까지 보일것이냐 1~10까지 보일꺼냐 정하는 것.


서블릿

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;
		}
		try {
			numPerpage=Integer.parseInt(request.getParameter("numPerPage"));
		}catch(Exception e) {
			numPerpage=5;
		}
        
        // 페이지 수만큼 데이터를 불러옴  ex) 1~5데이터,6~10데이터,11~16데이터 ...
		List<Student> list=new StudentService().selectStudentPage(cPage,numPerpage); 
		
		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;
		
		String pageBar="<ul class='pagination justify-content pagination-sm'>"; // 부스트랩 디자인
		
		if(pageNo==1) {
			//15버전
			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>";
			pageBar+="</li>";
		}
		
		while(!(pageNo>pageEnd||pageNo>totalPage)) {
			if(cPage==pageNo) {
				pageBar+="<li class='page-item disabled'>";
				pageBar+="<a class='page-link' href='#'>"+pageNo+"</a>";
				pageBar+="</li>";
			}else {
				pageBar+="<li class='page-item'>";
				pageBar+="<a class='page-link' href='"+request.getRequestURI()
						+"?cPage="+(pageNo)+"'>"+pageNo+"</a>";
				pageBar+="</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)+"'>다음</a>";
			pageBar+="</li>";
		}
		pageBar+="</ul>";
		
		request.setAttribute("pageBar", pageBar);
		
		request.getRequestDispatcher("/views/studentPage.jsp")
		.forward(request, response);
	}	

Service

	public int selectStudentCount() { // 학생수 조회
		SqlSession session=getSession();
		int count=dao.selectStudentCount(session);
		session.close();
		return count;
	}
    
    	public List<Student> selectStudentPage(int cPage, int numPerpage){
		SqlSession session = getSession();
		List<Student> result=dao.selectStudentPage(session,cPage,numPerpage);
		session.close();
		return result;	
	}

dao

  • Dao에서는 페이지처리할 때 마이배티스가 제공하는 페이징처리 클래스 이용
    -> RowBounds 클래스 이용함
  • 메소드 호출시 세번째 매개변수에 생성한 RowBounds클래스를 생성해서 전달시켜주면 됨
	public int selectStudentCount(SqlSession session) {
		// selectOne()메소드를 이용해서 데이터를 조회할 수 있다. (하나의 로우)
		int result = session.selectOne("student.selectStudentCount");
		return result;
	}
    
    public List<Student> selectStudentPage(SqlSession session, int cPage, int numPerpage){

		// 1 매개변수 : offset -> 시작 row번호를 보냄 (cPage-1)*numPerpage
		// 2 매개변수 : 범위 -> numPerpage
		// new RowBounds((cPage-1)*numPerpage,numPerpage);
        // RowBounds 객체는 알아서 마이배티스에서 처리해줌
		RowBounds rb=new RowBounds((cPage-1)*numPerpage,numPerpage);
		
		return session.selectList("student.selectStudentPage",null,rb); 
        // 두번째 매개변수는 조건이 따로없으면 파라미터값을 null로 둠
	}

mapping xml파일

	<select id="selectStudentCount" resultType="_int">  <!-- 개수를 반환해야하므로 리턴타입-> 정수  -->
		SELECT COUNT(*) FROM STUDENT
	</select>

	<select id="selectStudentPage" resultMap="studentMap"> 
		<!-- SELECT * FROM (SELECT ROWNUM AS RNUM, S.* FROM()) -->
		SELECT * FROM STUDENT <!-- 위 쿼리문을 작성할필요없이 Mybatis가 알아서 페이징처리해줌 -->
	</select>

jsp

	<c:if test="${not empty students }">
		<table>
			<tr>
				<th>학생번호</th>
				<th>학생이름</th>
				<th>학생전화번호</th>
				<th>학생이메일</th>
				<th>학생주소</th>
				<th>학생등록일</th>
			</tr>
			<tr>
				<c:forEach var="s" items="${students }">
					<tr>
						<td><c:out value="${s.studentNo}"/></td>
						<td><c:out value="${s.studentName}"/></td>
						<td><c:out value="${s.studentTel}"/></td>
						<td><c:out value="${s.studentEmail}"/></td>
						<td><c:out value="${s.studentAddress}"/></td>
						<td><c:out value="${s.reg_date}"/></td>
					</tr>
				</c:forEach>
			</tr>
		</table>
	</c:if>	

	<div>
		<c:out value="${pageBar}" escapeXml="false"/> 
      <!-- escapeXml -> pageBar 자체를 문자열로 인식시키기 위해서 -->
	</div>
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글