PreparedStatement
미리 SQL문이 셋팅된 Statement가 DB에 전송되어져서 컴파일 되어지고
SQL문의 '?'만 나중에 추가 세팅해서 실행되어지는 준비된 statement
장점
1. statement에 비해 반복적인 SQL문을 사용할 경우에 더 빠르다. ex. 검색문
2. DB컬럼타입과 상관없이 ? 하나로 표시하면 되므로 개발자가 헷갈리지 않고 쉽다. ex. insert문
-> ?를 제외한 SQL문이 DB에서 미리 컴파일되어져서 대기
단점
SQL문마다 PreparedStatement 객체를 각각 생성해야 하므로 재사용불가
-> statement 객체는 SQL 문이 달라지더라도 한 개만 생성해서 재사용이 가능
특징
Statement stmt = conn.createStatement(); //생성.. stmt.execute(sql)실행
PreparedStatement pstmt = conn.prepareStatement(sql) //생성.. pstmt.execute()
주의
DB 객체들(table..)의 뼈대(테이블명 or컬럼명 or시퀀스명 등의 객체나 속성명)은 '?'로 표시할 수 없다
data 자리에만 ?로 표시할 수 있음
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
conn = SingletonHelper.getConnection("oracle");
String sql = "select empno, ename from emp where deptno=?";
//where empno=? deptno=? and sal > ?
//pstmt.setInt(1, 7788);
//pstmt.setString(2, 30);
//pstmt.setInt(3, 1000);
//stmt = conn.createStatement();
pstmt = conn.prepareStatement(sql); //명령객체 생성시 oracle 쿼리 미리 보내서 컴파일
pstmt.setInt(1, 30); //? > parameter 설정
//rs = stmt.executeQuery(sql);
rs = pstmt.executeQuery(); //여기서 실행시 oracle parameter 값만
if(rs.next()){
do{
System.out.println(rs.getInt("empno") + "/" + rs.getString("ename"));
}while(rs.next());
}else {
System.out.println("조회된 데이터가 없습니다.");
}
}catch(Exception e){
}finally{
SingletonHelper.close(pstmt);
SingletonHelper.close(rs);
//SingletonHelper.close(conn) 공유객체 (singleton)안돼요...
}
try{
conn = SingletonHelper.getConnection("oracle");
String sql = "update dmlemp set ename=?, sal=?, deptno=?, job=? where empno=?";
pstmt = conn.prepareStatement(sql); //미리 쿼리문 컴파일
//parameter 설정
pstmt.setString(1, "방가");
pstmt.setInt(2, 20000);
pstmt.setInt(3, 20);
pstmt.setString(4, "IT");
pstmt.setInt(5, 7499);
//실행
int row = pstmt.executeUpdate();
if(row > 0){
out.print("<b>update row count </b>" + row);
}else {
out.print("<b>row count :</b>"+row);
}
}catch(Exception e){
}finally{
SingletonHelper.close(pstmt);
}