페이징 쿼리 이용하기
자바 JDBC 프로그래밍 강의 18 - 페이징 쿼리 이용하기
지난 시간 페이징 쿼리를 작성했다.
SELECT * FROM (
SELECT ROWNUM NUM, N.* FROM ( --N(서브쿼리의 결과집합).*을 가져옴
SELECT * FROM NOTICE ORDER BY REGDATE DESC
) N --N이 서브쿼리의 별칭
)
WHERE NUM BETWEEN 1 AND 10 ;
이걸 getList()의 쿼리문에 복붙해준다.
그리고 페이지번호인 1과 10은 바뀔 수 있어야 한다. getList의 인자로 전달한다.
public List<Notice> getList(int page) throws ClassNotFoundException, SQLException {
int start = 1 + (page-1)*10; //1, 11, 21, 31...
int end = 10*page;// 10, 20, 30....
String sql = "SELECT * FROM ("
+ " SELECT ROWNUM NUM, N.* FROM ( "
+ " SELECT * FROM NOTICE ORDER BY REGDATE DESC"
+ " ) N"
+ ") "
+ "WHERE NUM BETWEEN ? AND ?"; //preparedstatement필요
Class.forName(driver);
Connection con = DriverManager.getConnection(url, uid, pwd);
//Statement st = con.createStatement();
PreparedStatement psmt = con.prepareStatement(sql);
psmt.setInt(1, start);
psmt.setInt(2, end);
ResultSet rs = psmt.executeQuery(); //sql인자를 제거한다.
?가 들어갔으니.. 이제 그냥 statement로는 안된다. PreparedStatement로 교체해주자.
PreparedStatement가 쓰였더라도, SELECT문이기 때문에 여전히 ResultSet객체는 필요하다. 다만 기존 st가 아니라 psmt객체에서 얻어온 executeQuery()를 사용하자. 이 메서드에는 sql인자가 필요없다. psmt가 갖고 있기 때문이다.
이제 테스트해보자.
//NoticeConsole.java
List<Notice> list = service.getList(1);
page를 1을 넣어서 테스트 해보자.
이렇게 나왔다. 2페이지를 검색해보자.
다음 페이지가 나왔다.