자바와 데이터베이스 연동하기
전에 만들었던 은행관리 프로그램을 데이터베이스와 연동해봤다.(mysql)
연동과정에서 발생한 오류.
Exception in thread "main" java.sql.SQLException:Operation not allowed after ResultSet closed.
메시지를 보면 알겠지만 Resultset이 닫히고 나서는 작동이 불가하다고 한다.
하지만 저기 어디에도 rs.close() 코드가 없다.
한참을 해메다가 알아낸 이유는 Resultset은 statement하나당 하나만 열수 있다는 것.
만약 똑같은 Statement로 다시 rs를 정의할 경우 그 전의 rs는 자동으로 닫힘.
조금 수정한 코드.
27번줄에서 예금액을 수정해주고
32번 줄에서 값이 변경되었기 때문에 rs값을 새로 받아온다.(기존 Resultset은 자동으로 닫힘. 새로 받아오지 않으면
Exception in thread "main" java.sql.SQLException:Operation not allowed after ResultSet closed. 오류 발생)
33번 줄 rs.next(); (resultset. next()) 이건 다음 레코드로 커서를 이동하는 메서드지만 Resultset에 값을 받아온 후 처음 rs.next(); 이 메서드를 호출하면 받아온 레코드의 첫 행으로 커서를 이동시킨다.
계좌번호부터 차례대로 값을 읽어와야 하기 때문에 첫 레코드로 커서를 이동시킨다.
DB연동할 때 까다로운 점이 커서의 위치, 이동을 계속 신경써야 한다는 점이다.
일반적으로 자바내에서 일반변수에 1차원 배열 값을 대입하면 커서 상관없이 인덱스로 값을 가져올 수 있다.
그러나 DB연동과정에서는 커서가 어디에 가 있는지 계속 신경쓰면서 코드를 작성해야 한다.
안 그러면
java.sql.SQLException: After end of result set
java.sql.SQLException: before start of result set
이 오류들을 여지없이 만나게 된다.
둘 모두 커서가 제 위치 혹은 생각한 위치에 있지 않기 때문에 발생하는 오류들이다.
그래서 커서 위치를 자유롭게 통제하는 여러 명령어들이 있다.
beforeFirst() resultset객체의 첫 부분으로 이동
afterLast(); resultset객체의 끝부분으로 이동
first() 처음 레코드가 존재하는 행으로 이동
last() 마지막 레코드가 존재하는 행으로 이동
absolute(int rownum) 지정한 위치로 커서 이동
하지만 이런 이동관련 메서드들을 호출해서 커서를 자유롭게 이동시키기 위해선 Resultset 옵션값을 수정해주어야
한다. 기본값으로 TYPE_FORWARD_ONLY 가 설정되어있기 때문에
TYPE_SCROLL_SENSITIVE (커서이동을 자유롭게 하고 업데이트 내용 반영)
TYPE_SCROLL_INSENSITIVE(커서이동을 자유롭게 하고 업데이트 내용은 반영하지 않는다)
둘 중에 하나로 설정값을 바꿔주어야 커서 이동을 자유롭게 할 수 있다.
CONCUR_UPDATABLE 데이터 변경가능
CONCUR_READ_ONLY 읽기전용
프로그램 test 클래스
계좌번호 중복을 막기위해 PRIMARY KEY로 설정
계좌생성 클래스
입금 클래스
21 ; statement 객체를 매개변수로 받아서 데이터베이스에 입력한 계좌번호가 있는 지 조회 후
입력한 계좌번호를 반환한다.
22~23: 자주 쓰이는 입력한 계좌번호와 일치하는 계좌정보를 읽어오는 구문을 sql에 대입하고
PreparedStatement를 선언하면서 커서의 자유로운 이동을 위해 resultset 설정값을
TYPE_SCROLL_SENSITIVE로 바꾼다.
28 : 불러온 레코드의 첫 행으로 이동(resultset 값을 불러오고 처음 호출 시-rs.first()와 동일)
34: 계좌번호를 출력하면서 커서가 마지막 열에 있는 상태이므로 처음으로 이동시킨다.
42: 입금 때문에 예금액이 변경되었으므로 다시 불러온다.
출금클래스
송금클래스
계좌삭제 클래스
계좌번호 조회/ 비밀번호 대조 클래스
3번 이상 틀리면 프로그램 종료
처음에는 커서의 이동에 신경써야하는 걸 모르다가 영어 사이트를 보고 깨달음;;;
여기서 arraylist를 살려야 하는데 어떻게 하는지는 감도 잡히질 않는다...
자바 배운지도 한달 조금 더 지났네;;; 실력이 늘긴 한걸까
'JAVA' 카테고리의 다른 글
JAVA 소켓 채팅 프로그램 (server) (0) | 2021.03.04 |
---|---|
JAVA 소켓 채팅 프로그램 (Client) (0) | 2021.03.04 |
도서정보프로그램(클래스 분리) (0) | 2021.01.21 |
은행관리 프로그램 (클래스 분리) (0) | 2021.01.20 |
학점출력 프로그램 -상속 (0) | 2021.01.15 |