웹개발 교육/Java

[40일] JDBC (14) - 페이징

ewok 2022. 9. 22. 17:49

sungjuk 테이블에서 이름 순으로 정렬 후 행 번호 4~6만 조회하시오

이번에도 번호는 변수로 처리하여 조회하고자 하는 행 번호를 변경할 수 있게 하고자 한다.

 

먼저 SQL문을 작성하자

--문제) sungjuk 테이블에서 이름 순으로 정렬 후 행 번호 4~6만 조회하시오
1)
SELECT uname, aver, addr
FROM sungjuk
ORDER BY uname;

2) rownum도 같이 정렬된다
SELECT uname, aver, addr, rownum
FROM sungjuk
ORDER BY uname

3) 1)의 결과를 셀프조인하고 rownum 추가하기
SELECT uname, aver, addr, rownum
FROM (
		SELECT uname, aver, addr
		FROM sungjuk
		ORDER BY uname
);

4) 행번호 4~6 조회하기 (결과:조회되지 않음)
SELECT uname, aver, addr, rownum
FROM (
		SELECT uname, aver, addr
		FROM sungjuk
		ORDER BY uname
)
WHERE rownum>=4 and rownum<=6;

5) 3)의 내용을 한번 더 셀프조인하고, 행번호 4~6 조회하기
SELECT *
FROM (
		SELECT uname, aver, addr, rownum as rnum
		FROM (
				SELECT uname, aver, addr
				FROM sungjuk
				ORDER BY uname
			 )
	 )
WHERE rnum>=4 and rnum<=6;

 

package jdbc0922;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test07_selectPaging {

	public static void main(String[] args) {
		// 페이징
		// 문제) sungjuk 테이블에서 이름 순으로 정렬 후 행 번호 4~6만 조회하시오
		int start=4;  //시작 행번호
		int end=6;    //끝 행번호
		
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "1234";
			String driver = "oracle.jdbc.driver.OracleDriver";
			Class.forName(driver);
			con = DriverManager.getConnection(url, user, password);				
			System.out.println("오라클 DB 서버 연결 성공!!");
			
			StringBuilder sql = new StringBuilder();
			sql.append(" SELECT * ");
			sql.append(" FROM (\r\n"
					+ "		SELECT uname, aver, addr, rownum as rnum\r\n"
					+ "		FROM (\r\n"
					+ "				SELECT uname, aver, addr\r\n"
					+ "				FROM sungjuk\r\n"
					+ "				ORDER BY uname\r\n"
					+ "			 )\r\n"
					+ "	 ) ");
			sql.append(" WHERE rnum>=? and rnum<=? ");

			
			pstmt = con.prepareStatement(sql.toString());
			pstmt.setInt(1, start);
			pstmt.setInt(2, end);
			
			rs = pstmt.executeQuery();

			if(rs.next()) {
				System.out.println("자료있음~~");
				do {
					
					System.out.print(rs.getString("uname") + " ");
					System.out.print(rs.getInt("aver") + " ");
					System.out.print(rs.getString("addr") + " ");
					System.out.print(rs.getInt("rnum") + " ");
					System.out.println();
				
					
				} while(rs.next());
				
			} else {
				System.out.println("자료없음!!");
			}//if end 
			
		} catch (Exception e) {
			System.out.println("오라클 DB 연결 실패 : " + e);
		} finally {
			try {
				if(rs!=null) {rs.close();}
			} catch (Exception e) {}
			
			try {
				if(pstmt!=null) {pstmt.close();}
			} catch (Exception e) {}
			
			try {
				if(con!=null) {con.close();}
			} catch (Exception e) {}
		}//end
		
		System.out.println("END");
		
	}//main() end
}//class end

여기서는 SELECT *을 사용하였는데, 그 이유는 FROM 안에 칼럼명이 다 노출되어 있어 구체적인 칼럼명을 알 수 있기 때문이다.