상세 컨텐츠

본문 제목

JDBC ResultSet 위치 이동

프로그래밍/JAVA

by RosetteNebula 2021. 1. 28. 14:26

본문

 

흔히 JDBC로 결과값이 있을때 출력을 하면 

rs.next()를 많이 사용합니다

 

그런데 rs.next를 한번이라도 사용하면

ResultSet의 위치는 다음으로 넘어갑니다

 

예를 들어 

rs = stmt.executeQuery("select * from visitors");라고 우선 데이터를 검색하고

결과 값이 있는지 확인을 위해

if(rs.next())를 사용했다면 rs의 위치는 첫번째가 아닌 두번째가 됩니다

여기서 문제는

while(rs.next())로 결과값을 출력을 하려고 하면

rs의 위치가 두번째 이기에 첫번째의 데이터는 나오지 않습니다

 

해결 방법은

DB에 연결할 때 Statement에 ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE을 추가 해줘야 합니다 

stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

 

이렇게 하면 ResultSet의 위치를 이동 시킬수 있습니다

위의 코드가 없다면 오류가 발생 합니다

 

while(rs.next())문 위에 rs.beforeFirst()를 추가 해주시면

rs의 위치가 가장 처음으로 돌아갑니다

 

ResultSet을 이동하기 위한 필수 옵션

TYPE_FORWARD_ONLY - 위치 이동을 다음 레코드로만 이동하도록

TYPE_SCROLL_SENSITIVE - 위치 이동을 자유롭게 하고 업데이트 내용 반영

TYPE_SCROLL_INSENSITIVE - 위치 이동을 자유롭게 하고 업데이트 내용 미반영

CONCUR_UPDATABLE - 데이터 변경이 가능 하도록

CONCUR_READ_ONLY - 데이터 변경이 불가능 하도록

 

그외 위치이동에 관한 메소드는 더 있으니 상황에 맞게 활용 하시면 될듯 합니다

rs.next() - 다음위치로

rs.previous() - 이전의 위치로

rs.beforeFirst() - 처음 위치로

rs.afterLast() - 마지막 위치로

 

Connection con;
Statement stmt;
ResultSet rs;

String url = "jdbc:mysql://localhost/testdb";
String id = "root";
String password = "1234";
con = DriverManager.getConnection(url, id, password);
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

 

 

rs = stmt.executeQuery("select * from visitors");
		
if(rs.next()) {
	rs.beforeFirst();
	while (rs.next()) {
		System.out.println("이름 : " + rs.getString("name")
						+ ", 전화번호 : " + rs.getString("phone_num")
						+ ", 성별 : " + rs.getString("gender")
						+ ", 날짜 : " + rs.getString("today")
		);
	}
}

관련글 더보기