ㅁ < Statement, PreparedStatement >
- 둘 다 sql문을 실행하고 결과를 받아내는 객체다.
- Statement가 PreparedStatement의 부모다. (상속구조)
- Statement는 완성 형태의 sql문을 전달하면서 곧바로 실행한다.
완성 형태란 실제 데이터값들이 다 채워진 상태를 말한다.
- PreparedStatement는 미완성 형태의 sql문을 임시로 가지고 있다가 완성시킨 후 실행시킬 수 있다.
미완성 형태란 실제 데이터값이 채워질 공간을 ?(홀더)로 공간을 확보해둔 상태로 작성해둔 형태를 말한다.
ex) insert into 테이블 values(?, ?, ?)
ㅁ < Statement 방식 >
(1) Connection 객체를 통해 Statement 객체 생성
stmt = conn.createStatement();
(2) sql문을 전달하면서 실행 후 결과받기
결과 = stmt.executeXXX( 완성된 sql문 );
ㅁ < PreparedStatement 방식 >
- 장점. 쿼리문을 초기에 작성할 때 굉장히 간결하게 작성할 수 있다.
- 거의 PreparedStatement를 주로 쓴다.
- 단점. sql문을 프린트문으로 잘 작성했는지 확인해볼 수 없다.
(1) Connection 객체를 통해 PreparedStataement 객체 생성
pstmt = conn.prepareStatement( [미]완성된 sql문 ); // 객체를 생성할 때 sql문을 담는다.
(2) PreparedStatement에 담긴 sql문이 미완성된 상태일 경우 완성시키기
pstmt.setXXX(홀더 순번, 채울값);
(3) sql문 실행 후 결과받기
결과 = pstmt.executeXXX(); // sql문 전달 x
ㅁ SELECT * FROM MEMBER같은 완성된 sql문은 그냥 Statement 쓰면 됨.
근데 사용자가 입력한 값들을 채워야 하는 경우는 PreparedStatement를 사용하면 훨씬 간결하게 작성 가능하다.
ㅁ PreparedStatement 예시
public int insertMember(Member m) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
String sql = "INSERT INTO MEMBER VALUES(SEQ_UNO.NEXTVAL, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE)";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
pstmt = conn.prepareStatement(sql); // sql문을 담은채로 생성. (하필 미완성된 sql문)
// ? 자리에 실제 데이터값 채우기
// pstmt.setString(홀더 순번, 대체할 값)
// pstmt.setInt(홀더 순번, 대체할 값)
pstmt.setString( 1, m.getUserId() );
pstmt.setString( 2, m.getUserPwd() );
pstmt.setString( 3, m.getUserName() );
pstmt.setString( 4, m.getGender() );
pstmt.setInt( 5, m.getAge() );
pstmt.setString( 6, m.getEmail() );
pstmt.setString( 7, m.getPhone() );
pstmt.setString( 8, m.getHobby() );
result = pstmt.executeUpdate();
if(result > 0) { conn.commit(); }
else { conn.rollback(); }
}
catch (ClassNotFoundException e) { e.printStackTrace(); }
catch (SQLException e) { e.printStackTrace(); }
finally {
try {
pstmt.close();
conn.close();
}
catch (SQLException e) { e.printStackTrace(); }
}
return result;
}
- ?에 홑따옴표 포함.
- pstmt.setString(홀더순번, 대체할값)에도 홑따옴표 포함.
ㅁ 회원 이름으로 키워드 검색하는 경우(부분 검색)
- String sql = "SELECT * FROM MEMBER WHERE USER_NAME LIKE ?";
- pstmt.setString(1, "%" + userName + "%");
'클라우드 활용 자바개발자 양성과정 > 02-2. JDBC' 카테고리의 다른 글
7. JDBC MVC패턴 실습문제 & 최종정리 (0) | 2024.08.01 |
---|---|
5. Properties (0) | 2024.08.01 |
4. 모듈화 작업 & static import (0) | 2024.07.31 |
2. JDBC에 MVC 패턴 적용하기 (0) | 2024.07.29 |
1. JDBC 기본 (0) | 2024.07.29 |