ResultSet과 ResultSetMetaData (feat. 커서 이동 옵션)

반응형

ResultSet 예제 참고

https://yeo-computerclass.tistory.com/142?category=1269285 

 

[JSP] JDBC 연동 (MySQL) - (2)

📌세팅 testDB에 test라는 table을 하나 생성해주었다. statementTest.jsp executeQuery(String sql) executeQuery() 메서드의 경우는 SELECT문을 실행할 때 사용된다. executeQuery() 메서드는 ResultSet 객체..

yeo-computerclass.tistory.com

 

 


 

 

📌ResultSet

ResultSet이란 Statement 객체 또는 PreparedStatement 객체로 SELECT문을 사용하여 얻어온 레코드 값들을 테이블의 형태로 갖게 되는 객체이다. Statement또는 PreparedStatement객체의 executeQuery()메소드의 반환 값을 확인해보면 ResultSet으로 되어있는 것을 알 수 있다.  즉, SELECT문을 통해서 데이터를 얻어온다면 ResultSet객체에 그 데이터가 저장되기 때문에 SELECT문으로 데이터를 얻어올 때는 반드시 사용해야 하는 객체이다.

메소드 설명
close() ResultSet 객체를 밴환한다.(닫는다.)
getXXX(int ColumnIndex) 인자로 지정된 번호의 컬럼값을 XXX 데이터 타입으로 가져온다. (컬럼 인덱스 지정)
getXXX(String ColumnName) 인자로 지정한 컬럼명의 컬럼값을 XXX 데이터 타입으로 가젼온다.(컬럼명 지정)
next() 다음 행(레코드)으로 커서(작업 위치)를 이동한다. 다음 행이 없으면 false 반환, 있으면 true 반환.

 

 

 

Result의 커서 자유롭게 이동

여기서 자신이 원하는 레코드에 접근하려면 커서를 자유롭게 움직일 수 있어야 한다. 커서 이동 관련 메서드는 다음과 같다

메서드 설명
absolute(int rowNum) 지정한 위치로 커서를 이동한다.
beforeFirst() 커서를 처음 레코드 이전 위치로 이동한다.
커서를 실제 레코드가 아닌 ResultSet 객체의 처음 부분으로 이동한다.
afterLast() 커서를 마지막 레코드 이후 위치로 이동한다.
커서를 실제 레코드가 아닌 ResultSet 객체의 끝 부분으로 이동한다.
first() 처음 레코드가 존재하는 행으로 이동한다.
last() 마지막 레코드가 존재하는 행으로 이동한다.
next() 다음 레코드 행으로 이동한다.
previous() 이전 레코드 행으로 이동한다.

 

하지만 위와 같이 커서 이동 관련 메소드를 사용하기 위해서는 커서 옵션을 설정해주어야 한다. 만약 커서 옵션을 설정하지 않으면 자동으로 TYPE_FORWARD_ONLY 값이 적용되어 first()와 last() 등 커서를 이동하는 메소드를 이용할 수 없게 된다.

상수명 설명
TYPE_FROWARD_ONLY 커서 이동을 다음 레코드로만 이동되도록 한다.
TYPE_SCROLL_SENSITIVE 커서 이동을 자유롭게 하고 업데이트 내용을 반영한다.
TYPE_SCROLL_INSENSITIVE 커서 이동을 자유롭게 하고 업데이트 내용을 반영하지 않는다.
CONCUR_UPDATABLE 데이터 변경이 가능하도록 한다.
CONCUR_READ_ONLY 데이터 변경이 불가능하도록 한다.
//사용 예


...

Connection conn=null;
String sql="SELECT * FROM 테이블명";
PreparedStatement pstmt = null;
ResultSet rs = null;

try{
    Class.forName(driver);
    conn.DriverManager.getConnection(url,"아이디","비밀번호");
    
    pstmt=conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, 
                                     ResultSet.CONCUR_UPDATABLE);
    rs=pstmt.executeQuery();
    
    
    rs.last();  //커서를 마지막 행으로 옮긴다.
    out.println(rs.getInt(1)+","+rs.getString(2)+"<br>");
    
    rs.first(); //커서를 처음 행으로 이동시킨다.
    out.println(rs.getInt(1)+","+rs.getString(2)+"<br>");
    
    rs.absolute(3);  //커서를 3번째 레코드의 위치로 이동시킨다.
    out.println(rs.getInt(1)+","+rs.getString(2)+"<br>");
}catch(Exception e){
    out.println("<h3>데이터 가져오기에 실패하였습니다.</h3>");
    e.printStackTrace();
}finally{
    try{
    rs.close();
    pstmt.close();
    conn.close();
    }catch(Exception e){
        e.printStackTrace();
    }
}

 

 

 

 

 

 

 

 

 

 

📌ResultSetMetaData

ResultSetMetaData 객체는 ResultSet으로 얻어온 레코드들의 메타 정보에 해당하는 컬럼의 정보들을 제공한다. ResultSetMetaData 객체를 사용하게 되면 컬럼 수나 각 컬럼 이름, 컬럼 타입 등의 정보를 쉽게 알아낼 수 있다. 

 

메서드 설명
getColumnCount() ResultSet에 저장되어있는 테이블의 컬럼의 수를 반환한다.
getColumnLabel(int column) 해당 번호의 컬럼의 레이블(title)을 반환한다.
getColumnName(int column) 해당 번호의 컬럼의 이름을 반환한다.
getColumnType(int column) 해당 번호의 컬럼의 데이터 타입을 int형으로 반환한다.
getColumnTypeName(int column) 해당 번호의 컬럼의 데이터 타입을 String형으로 반환한다.

 

 

예제

22: ResultSet 객체로부터 ResultSetMetaData 객체를 얻어온다.

24: 컬럼의 총 개수를 얻어온다.

25: 각 컬럼의 이름을 얻어온다.

27: 각 컬럼의 데이터 타입을 얻어와 출력한다.

 

결과

반응형

'JSP & Servlet > 개념' 카테고리의 다른 글

이클립스에서 DB 연동하기 (MySQL)  (0) 2022.06.16
[JDBC] 트랜잭션 처리  (0) 2022.04.24
Statement와 PreparedStatement의 차이점  (0) 2022.04.24
[JSP] JDBC 연동 (MySQL) - (2)  (0) 2022.04.24
[JSP] JDBC 연동 (MySQL) - (1)  (0) 2022.04.24