흔히 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")
);
}
}
JAVA Scanner 사용 시 잘못된 타입 입력 오류 처리 (1) | 2021.01.28 |
---|---|
java myslq 학생정보 프로그램 (0) | 2021.01.27 |
java로 DB 검색 후 값이 없을때 (0) | 2021.01.27 |
Thread 클래스의 주요 메서드 (0) | 2021.01.26 |
JAVA swing TextArea 사이즈 조절 (0) | 2021.01.25 |