< Prepared Statement >
select * from member where id = ?
=> 쿼리문 특정 부분 (?) 을 변수로 주고, 바꾸면서 사용할 상황
=> PreparedStatment
+ 파싱 컴파일 생략으로 속도도 빠르다
connection con = null;
PreparedStatement ps = con.prepareStatemente( "select * from member where id = ?" );
( 아직 미정인 부분을 "?" 로 줘놓고 사용 )
- 여러개도 물론 가능하다. ( INDEX 사용 )
String sql = "insert into member values(?,?,?,?,?,now())";
PreparedStatement pt = con.prepareStatement(sql);
pt.setStrng( index, value ) => 몇번째 "?"에 ( 1부터 시작 ) value 값을 넣겠다.
pt.setInt(1, 4);
pt.setInt(2, 1212);
pt.setString(3, "prepared");
pt.setString(4, "01013131414");
pt.setString(5, "hey@naer.com");
이렇게 넣어주고
pt.executeUpdate();
execute 해주면 된다.
( insert / update / delete 는 executeUpdate
select 는 executeQuery + ResultSet )
< 2. ResultSet >
select 조회문에서
PreparedStatement 의 executeQuery 결과물을 담는 그릇인 Resultset.
String sql ="select PW from member where id = ?";
PreparedStatement pr = con.prepareStatement(sql);
pr.setInt(1, member.getId());
ResultSet resultSet = pr.executeQuery();
(이렇게 결과값을 담아두고)
if ( ! resultSet.next() ) {
System.out.println("존재하지 않는 아이디 입니다. 확인 후 다시 시도해 주세요.");
System.exit(0);}
else{
//resultSet.next();
int pwcheck = resultSet.getInt(1);
if (pwcheck != member.getPw()) {
System.out.println("비밀번호가 일치하지 않아 실행할 수 없습니다. 다시 시도해 주세요.");
System.exit(0); }
}
담아둔 결과값이 있는지 / 없는지
즉, next 가 true / false 인지에 따라서 조건문을 통해 오류처리를 할 수 있다.
resultSet.next( )
이 넥스트 메소드의 결과물은 Boolean 타입이다.
(마치 scanner의 hasNextLine 과 같은 )
그러므로 기본적으로는
조건문 혹은 반복문과 같이 사용해야 한다.
if ( resultSet.next() ) ~~
while ( resultSet.next() ) ~~
ResultSet의 getString / getInt 등의 메소드를 사용하기 위해서는
먼저 이 Boolean으로 먼저 확인을 해 줘야 (통과절차) 사용할 권한이 생긴다.
즉, 저거 안하면 오류 ( 호출불가/ Error Before resultSet ) 가 나서 사용을 못한다.
특이한점은
ResultSet resultSet = pr.executeQuery();
resultSet.next();
int pwcheck = resultSet.getInt(1);
Boolean 타입인데도 불구하고,
저렇게 마치 선언 하는 것 마냥 사용할 수 도 있다는 것이다.
" resultSet을 첫 번째 행으로 옮긴다 "
=> 이런 의미를 가진다고 생각하면 된다.
하지만 그 근본은 Boolean 타입임을 잊으면 안된다.
if ( ! resultSet.next() ) {
System.out.println("존재하지 않는 아이디 입니다. 확인 후 다시 시도해 주세요.");
System.exit(0);}
else {
//resultSet.next();
int pwcheck = resultSet.getInt(1); }
=> 이렇게 if 와 쓰는것이 일반적인 사용이고,
여기선 else 에서 resultSet.next() 가 True 라는 의미가 내포되어있기 때문에,
Boolean 검사가 이미 실행 된것이다 (통과절차)
그렇기 때문에 resultSet. getInt 메소드를 실행 할 수 있다.
오히려, 저기서 한번 더 resultSet.next() 를 쓰면 그 다음 next를 찾는게 되어서
오류가 난다.
기본적으로 if , 반복문과 함께 사용해야 하고,
저렇게 선언식으로 쓰인게 있다면 그 의미를 이해할 줄 알아야겠다.
+ resultSet 은 Boolean 타입이기 때문에
if( resultSet.next() != null ) 이런식으로 사용하는건 아무 의미가 없다.
( 다음값이 null 인가 이렇게 사용할 수 없다. ( 의미상 그럴듯해서 시도하다 실패 )
Boolean 타입으로, 자체가 그냥 true /false 의 의미를 가진다. )
'Back to the DataBase' 카테고리의 다른 글
예약 가능한 날짜 SQL => if 와 all 사용 (0) | 2022.10.11 |
---|---|
DAO 잡다한 실수들 (0) | 2022.07.19 |
DAO DTO Main 3단 분업 (0) | 2022.07.19 |
JAVA 에서 SQL 문으로 DB 이용하기 (0) | 2022.07.18 |
JAVA => JDBC => MySQL DB 연동 (0) | 2022.07.18 |