CODEDRAGON ㆍDevelopment/Java
ResultSet 인터페이스
ResultSet 인터페이스는 SELECT문을 executeQuery()메소드로 실행한 다음 반환되는 레코드 셋(recoredset)을 저장합니다. 레코드 셋은 가상의 데이터베이스 테이블 형태입니다.
SELECT문을 통해서 데이터를 가져오는 경우 ResultSet객체에 데이터를 저장해야 합니다.
ResultSet 구조도
· 모든 데이터를 한번에 가져올 수 없기 때문에 cursor의 개념을 가지고 있습니다.
· 커서(cursor)란 ResultSet 객체가 가져올 수 있는 행의 위치을 지정해 줍니다.
· 처음 커서의 위치는 결과물(필드)에 위치하지 않기 때문에 cusror를 이동해야 합니다.
· 커서를 이동하는 역할은 ResultSet의 next() 메서드가 수행합니다.
· next() 메서드의 리턴 타입은 boolean 인데 이는 다음 행의 결과물(필드)이 있으면 true, 없으면 false를 리턴 합니다.
select id, age from test |
ResultSet.next()
· ResultSet으로부터 레코드를 읽어오기 위해 next()메소드를 사용하는데 next()메소드는 읽어올 레코드가 있으면 true를 반환하고 없으면 false를 반환합니다.
· next()메소드는 ResultSet의 현재 레코드를 가리키는 포인터인 커서를 이동시킬 뿐이고 커서가 가리키고 있는 현재 레코드로 부터 필드 값을 읽어오려면 필드값의 유형에 따라 getXXX()메소드를 사용해야 합니다.
· 커서(cursor)를 이동하는 메서드가 ResultSet의 next() 메서드입니다.
· 초기 ResultSet의 포인터는 첫 번째 레코드 전의 위치를 가리키고 있기 때문에 ResultSet 의 첫번째 레코드로 포인터를 이동시키기 위해 next()메소드를 사용해야 합니다.
ResultSet.getXXX()
· ResultSet 객체가 결과물(필드)을 가져올 수 있는 행으로 이동이 되었다면 해당 행의 실제 결과물(필드)을 가져와야 합니다.
· ResultSet 인터페이스에는 결과물(필드)을 가져오는 수많은 메서드(getXXX())를 제공합니다.
· getXXX() 메서드는 XXX에 Oracle의 자료형 타입에 따라 호출해주면 됩니다.
· 예를 들어 id 컬럼이 varchar2 타입이면 getString() 메서드를 사용 하고, age 컬럼이 number 타입이면 getInt() 메서드를 사용하면 됩니다.
· getXXX() 메서드는 두개씩 오버로드 되어 정의 되어 있는데 하나는 정수를 인자로 받는 것과 String 타입으로 인자를 받는 메서드를 제공하고 있습니다. 첫번째 정수를 받는 타입은 SELECT 문 다음에 쓰는 컬럼명의 인덱스를 지정하는데 인덱스의 처음번호는 1부터 시작합니다. 두번째 String 타입은 SELECT 문의 다음에 오는 컬럼명으로 지정해야 합니다.
· 즉, getXXX()메소드를 사용하여 필드(Column)값을 읽어올 때 필드 이름이나 정의된 필드 순서(1부터 시작)에 따라 정수 값을 지정해 줄 수 있습니다.
ResultSet rs = stmt.executeQuery("SELECT id, name FROM member"); while(rs.next()){ System.out.println("ID: " + rs.getString(1)); System.out.println("ID: " + rs.getString(2)); } |
ResultSet rs = stmt.executeQuery("SELECT * FROM member"); while(rs.next()){ System.out.println("ID: " + rs.getString("id")); System.out.println("ID: " + rs.getString("name")); } |
ResultSet.updateXXX()
updateXXX()메소드를 사용하여 ResultSet에서 커서가 가리키고 있는 현재 로우(레코드)의 컬럼(필드)값을 변경하거나 새로운 로우(레코드)를 추가할 수 있습니다.
현재 레코드의 컬럼(필드)값을 변경하려면 먼저, 앞 뒤 이동이 가능한 ResultSet에서 커서를 절대적인 위치나 현재 레코드로부터의 상대적인 위치로 이동시킨 다음 updateXXX()메소드를 사용합니다.
ResultSet rs = stmt.executeQuery("SELECT id, name FROM member"); rs.absolute(3); //커서를 3번째 로우(레코드)로 이동합니다. rs.updateString("name", "codedragon"); // "name"컬럼 값을 설정합니다. rs.updateRow(); // 설정한 내용으로 로우(레코드)를 변경합니다. |
새로운 로우(레코드)를 추가하기 위해 각 컬럼 값을 설정하려면 변경 가능한 ResultSet객체에 새로운 로우를 추가하기 위한 곳으로 커서를 이동한 다음 updateXXX()메소드를 사용하여 각 컬럼 값을 설정하고 그 값들을 가진 레코드를 ResultSet에 추가합니다. 그리고 다시 커서를 새로운 레코드를 추가하기 위한 곳으로부터 새롭게 레코드가 추가된 ResultSet의 위치로 이동시킵니다.
ResultSet rs = stmt.executeQuery("SELECT id, name FROM member"); rs.moveToInsertRow(); //새로운 로우를 추가하기 위한 곳으로 커서를 이동합니다. rs.updateNull(id, 3456); rs.updateString(name, "codedragon"); rs.insertRow(); rs.moveToCurrentRow(); |
'Development > Java' 카테고리의 다른 글
ResultSet의 cursor 옵션 (0) | 2017.07.24 |
---|---|
ResultSet 주요 메소드 (0) | 2017.07.24 |
PreparedStatement 인터페이스의 주요 메소드 (0) | 2017.07.24 |
PreparedStatement 사용방법, PreparedStatement의 객체 생성 (0) | 2017.07.24 |
PreparedStatement 동작 도식도, 오라클에서 SQL문 수행시 SGA 영역의 메모리 관리 (0) | 2017.07.24 |