ResultSet 인터페이스, ResultSet 인터페이스, ResultSet.next(), ResultSet.getXXX(), ResultSet.updateXXX()

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();