방명록
- [스프링] MySQL 페이징 처리 쿼리2022년 06월 23일 14시 45분 18초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
구멍가게 코딩단의 책 "코드로 배우는 스프링 웹 프로젝트(개정판)"으로 Spring legacy project 실습을 하고 있다. 책에서는 Oracle DB를 베이스로 하고 있는데 나의 경우에는 MySQL로 실습 중이다. 293~297쪽에서 Oracle DB에서의 페이징 처리를 다루기 있는데 MySQL에서는 쿼리문을 다르게 처리해줘야 한다.
아래의 코드는 BoardMapper.xml에 추가된 Oracle DB의 쿼리이다. MySQL에서는 이 쿼리를 사용할 수 없다.
<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO"> <![CDATA[ select bno, title, content, writer, regdate, updatedate from ( select /*+INDEX_DESC(tbl_board pk_board) */ rownum rn, bno, title, content, writer, regdate, updatedate from tbl_board where rownum <= #{pageNum} * #{amount} ) where rn > (#{pageNum} -1) * #{amount} ]]> </select>
MySQL에서는 다음의 쿼리를 BoardMapper.xml에 추가하면 된다.
<select id="getListWithPaging" resultType="com.dand.domain.BoardVO"> <![CDATA[ select bno, title, content, writer, regdate, updatedate from tbl_board WHERE bno > 0 order by bno DESC, regdate DESC LIMIT #{skip}, #{amount}; ]]> </select>
MySQL에서는 order by DESC 적용 시 인덱스 정렬로 수행되기 때문에 rownum을 고려할 필요가 없다. 또한 페이징은 LIMIT #{pageNum}, #{amount}를 이용하면 된다. #{pageNum}는 몇 개를 skip 하는지이고, #{amount}는 몇 개의 데이터를 가져오는지이다. 예를 들어 1~10을 가져오고 싶다면 "LIMIT 0, 10"이라고 하면 된다.
위 쿼리를 작성 후 아래 테스트 코드를 JUnit으로 실행하면 [그림 1]과 같이 성공적으로 수행된다.
@Test public void testPaging() { Criteria cri = new Criteria(); List<BoardVO> list = mapper.getListWithPaging(cri); list.forEach(board -> log.info(board)); }
728x90반응형'언어·프레임워크 > Spring' 카테고리의 다른 글
[Spring][문제해결] Spring의 web.xml 한글 깨짐 해결 (0) 2022.08.29 [스프링][문제해결] MySQL LIMIT 이용 페이징 처리시 페이지 번호 클릭 이동이 안되는 문제 (0) 2022.06.24 [스프링] Oracle의 nextval 함수를 MySQL에서 처리하는 방법 (0) 2022.06.20 [스프링][문제해결] MariaDB와 log4jdbc 관련 에러 (0) 2022.06.19 [스프링][문제해결] org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): (0) 2022.06.15 다음글이 없습니다.이전글이 없습니다.댓글