페이징 쿼리 이용하기

자바 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 ;

Untitled

이걸 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을 넣어서 테스트 해보자.

Untitled

이렇게 나왔다. 2페이지를 검색해보자.

Untitled

다음 페이지가 나왔다.