iBatis Paging with Oracle.
퍼시스턴스2009. 3. 2. 15:13
MSSQL이나 MYSQL은 자체 페이징 쿼리가 있어서
페이징이 쉽다.
오라클의 경우에는 보통 rownum을 사용하여 페이징을 처리 한다.
iBatis는 queryForList를 사용하여 리스트형태로 값을 가져 오는데.
여기서 시작값과 끝 값을 지정하여 페이징을 할 수도 있다.
하지만 이런 경우에는 일단 글을 다 긁어 온 다음에
메모리에서 해당 페이지 범위의 글을 가져온다.
이 방법의 경우 글이 작으면 상관이 없지만
글이 늘어 나면서 서버에 부하가 많이 걸린다.
하여튼 queryForList를 사용하여 페이징을 하지 않도록 주의 하고..(난 이걸로 해놨는데.. ㅠ_ㅠ.. 언제 바꿔)
오라클 쿼리를 사용해서 페이징을 처리 하도록 하자.
SELECT num, title, userid, writeday FROM (
SELECT rownum AS rnum, num, title, userid, writeday
FROM request
WHERE userid = #userid#
) WHERE rnum BETWEEN #startNum# AND #endNum#
ORDER BY num DESC
SELECT rownum AS rnum, num, title, userid, writeday
FROM request
WHERE userid = #userid#
) WHERE rnum BETWEEN #startNum# AND #endNum#
ORDER BY num DESC
파라미터로 startNum 과 endNum을 넘겨 주면 해당 범위 안의 글을 가지고 온다.
<select id="getList" resultMap="articleListMap" parameterClass="java.util.HashMap" />
- iBatis 설정 파일.
이렇게 하여 지정 범위 안의 글을 가지고 온다.
이렇게 하여 가져온 파일을 게시판 리스트 밑에 페이징 하는 부분이 또 문제.
여기는 잘 생각하여 로직만 정리 하면된다.
if ( pageNum <= 5)
{
for ( int i = 0, end = pageModel.getTotalPage(); i < end; i++)
{
if ( i >= 10) break;
pageList.add( i, i + 1 );
}
} else {
for ( int i = pageNum - 5, j = 0; i < pageNum + 6; i++, j++)
{
if ( i == pageModel.getTotalPage()) break;
pageList.add( j, i + 1);
}
}
난 위의 방법을 사용하여 처리하였다. 최대 10개씩 보여줄 수 있도록 티스토리 스타일 처럼
이것을 jsp에서 알맞게 보여 주도록 또 가공을 해야 한다.
<c:forEach var="list" items="${ pageModel.pageList }" varStatus="count">
<c:if test="${ list == pageModel.pageNum }" >
[<b><span id="movePage" onclick="movePage( this)">${ list }</span></b>]
</c:if>
<c:if test="${ list != pageModel.pageNum }" >
<span id="movePage" onclick="movePage( this)">${ list }</span>
</c:if>
</c:forEach>
보통 내가 쓰는 방법.
페이지 로직을 정리 해놓지 않아서.
그때그때 머리를 쥐어 짜서 만드니..
어떤때는 코드가 늘었다가 줄었다가..
-_-;;
로직을 잘 정리하도록 하자.
아이구 머리야.