JDBC에서 ResultSet 인터페이스는 SQL 쿼리 실행 결과로 생성된 테이블 형태의 데이터를 나타냅니다. ResultSet은 현재 행(row)을 가리키는 커서(cursor)를 내부적으로 관리하고 있으며, 최초 생성 시 이 커서는 첫 번째 행 바로 앞에 위치합니다.
ResultSet에서 커서(포인터) 이동하기
ResultSet 인터페이스가 제공하는 next() 메서드는 현재 위치에서 커서를 다음 행으로 한 칸 이동시킵니다. 이 메서드는 boolean 값을 반환하는데, 다음 행이 존재하면 true를, 더 이상 읽을 행이 없으면 false를 반환합니다. 따라서 while 루프와 함께 사용하면 결과 집합의 모든 데이터를 순차적으로 처리할 수 있습니다.
while(rs.next()){
}각 레코드의 컬럼 값 가져오기
ResultSet 인터페이스는 행의 각 컬럼 값을 조회할 수 있는 getter 메서드(getXXX())도 함께 제공합니다. 모든 getter 메서드는 두 가지 형태로 오버로딩되어 있습니다.
getXXX(int columnIndex): 컬럼의 인덱스를 나타내는 정수값을 매개변수로 받아 해당 컬럼의 값을 반환합니다. 인덱스는 1부터 시작합니다.
getXXX(String columnLabel): 컬럼 이름을 나타내는 문자열을 매개변수로 받아 해당 컬럼의 값을 반환합니다.
이때 테이블 컬럼의 데이터 타입에 맞는 적절한 getter 메서드를 선택해서 사용해야 합니다. 예를 들어 문자열 타입이라면 getString(), 정수 타입이라면 getInt(), 날짜 타입이라면 getDate()를 사용하는 식입니다.
예제 테이블
다음과 같은 구조와 데이터를 가진 dataset 테이블이 있다고 가정해 보겠습니다.
+--------------+-----------+ | mobile_brand | unit_sale | +--------------+-----------+ | Iphone | 3000 | | Samsung | 4000 | | Nokia | 5000 | | Vivo | 1500 | | Oppo | 900 | | MI | 6400 | | MotoG | 4360 | | Lenovo | 4100 | | RedMi | 4000 | | MotoG | 4360 | | OnePlus | 6334 | +--------------+-----------+
전체 예제 코드
아래 예제는 Dataset 테이블의 모든 레코드를 조회한 후 화면에 출력하는 자바 프로그램입니다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class RetrievingData {
public static void main(String args[]) throws Exception {
// 드라이버 등록
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// 데이터베이스 연결
String mysqlUrl = "jdbc:mysql://localhost/TestDB";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
System.out.println("Connection established......");
// Statement 객체 생성
Statement stmt = con.createStatement();
// 데이터 조회
ResultSet rs = stmt.executeQuery("select * from Dataset");
System.out.println("Contents of the table");
while(rs.next()) {
System.out.print("Brand: "+rs.getString("Mobile_Brand")+", ");
System.out.print("Sale: "+rs.getString("Unit_Sale"));
System.out.println("");
}
}
}실행 결과
Connection established...... Contents of the table Brand: Iphone, Sale: 3000 Brand: Samsung, Sale: 4000 Brand: Nokia, Sale: 5000 Brand: Vivo, Sale: 1500 Brand: Oppo, Sale: 900 Brand: MI, Sale: 6400 Brand: MotoG, Sale: 4360 Brand: Lenovo, Sale: 4100 Brand: RedMi, Sale: 4000 Brand: MotoG, Sale: 4360 Brand: OnePlus, Sale: 6334
위 예제에서 볼 수 있듯이 executeQuery() 메서드로 SELECT 쿼리를 실행하면 ResultSet 객체가 반환되고, next() 메서드를 통해 각 행을 순회하면서 getString()으로 컬럼 이름 기준으로 값을 손쉽게 가져올 수 있습니다. 이 패턴은 JDBC로 데이터베이스 데이터를 조회할 때 가장 기본적이면서도 널리 사용되는 방식입니다.