java.sql.Statement
public interface Statement
extends Wrapper

정적 SQL 문을 실행해, 작성된 결과를 돌려주기 위해서(때문에) 사용되는 객체입니다.  

디폴트에서는,Statement 객체 마다 1 개의 ResultSet 객체만이 동시에 오픈할 수 있습니다. 따라서, 1 개의 ResultSet 객체의 read가, 다른 read에 의해 끼어들어지면(자), 각각은 다른 Statement 객체에 의해 생성된 것이 됩니다. Statement 인터페이스의 모든 execution 메소드는, 문장의 현재의 ResultSet 객체로 오픈되고 있는 것이 존재하면, 그것을 암묵에 클로즈 합니다.

관련 항목:
Connection.createStatement() , ResultSet

java.sql.PreparedStatement
public interface PreparedStatement
extends Statement

프리컴파일 된 SQL 문을 나타내는 객체입니다.  

SQL 문은, 프리컴파일 되어PreparedStatement 객체에 포함됩니다. 거기서, 이 객체는, 이 문장을 여러 차례 효율적으로 실행하는 목적으로 사용할 수 있습니다.

주: IN 파라미터치를 설정하는 설정 기능 메소드 (setShort,setString 등)는, 입력 파라미터의 정의된 SQL 형과 호환이 있는 형태를 지정하지 않으면 안됩니다. 예를 들어, IN 파라미터에 INTEGER 라고 하는 SQL 형이 있는 경우,setInt 메소드를 사용하지 않으면 안됩니다.

임의의 파라미터형 변환이 필요한 경우는,setObject 메소드는, 목적의 SQL 형으로 사용하지 않으면 안됩니다.  

파라미터 설정의 예를 다음에 나타냅니다. con 는 액티브한 접속을 나타냅니다.

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
SET SALARY = ? WHERE ID = ? ");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
 

관련 항목:
Connection.prepareStatement(java.lang.String) , ResultSet

PreparedStatement 에 대한 설명 : http://pcguy7.springnote.com/pages/1052420
Summary 그래서 우리는 prepared statements를 파라메터와 함께 사용해야한다. 이것은 미리 만들어진 접근 계획을 재 사용하므로서 데이터 베이스에 대한 로드를 줄여 준다. 이 cache는 데이터 베이스가 확장된 것이어서 여러분의 모든 애플리케이션이 유사한 파라메터화된 sql을 사용하면 하나의 애플리케이션이 다른 애플리케이션에 의해 사용된 prepared statements를 이용하므로 캐시 스키마의 효율성을 증대 시킬 수 있다. 이것은 application server 사용의 이점이다. 왜냐하면 데이터 베이스에 접근하는 로직은 데이터 접근 계층에 집중화 되어야하기 때문이다. 두번째로 prepared statements의 올바른 사용은 또한 여러분이 애플리 케이션 내부의 prepared statements cache를 잘 이용할 수 있게 한다. 이것은 애플리케이션이 이전에 사용했던 prepared statements 호출을 재사용해서 JDBC driver에 대한 호출의 수를 감소시켜 성능의 향상을 시킨다. 이것은 현명한 fat clients 사용을 효율적으로 그리고 경쟁력있게 만들고 독점적인 connection을 유지할 수 없는 불이익을 제거한다. 만약 파라메타화된 prepared statements를 사용한다면 여러분은 데이터 베이스와 코드를 가지고 있는 application server의 효율을 높일 수 있다. 이들 개선된 점은 여러분의 애플리케이션의 성능을 향상 시킬수 있게 할것이다.


내 나름의 중요한 결론을 말해보자면, 'PreparedStatement를 잘 활용하면 CPU 사용량을 줄이고 DB에 접근하는 소프트웨어의 속도를 향상시키는 효과가 있다'는 것이다.

ㅡㅅ-)> 내가 쓰기 불편하다고 Statement 형식으로 많이 썼었는데, 이제 PreparedStatement를 사용해야겠다. 나란 녀석도 참 고집이 쎄다. 그렇게 쓰는 장점이 있는데도, 내가 쓰기 편하다고 그 방식을 외면하고 있으니 말이다. 

  1. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.09.16 22:09 신고

    여기서 본건 아닌데, 알려주셔서 여기다가도...ㅡ_ㅡ;;;

    Statement와 PreparedStatement의 중요한 차이점이 한가지 더 있습니다.
    Statement의 경우는 입력값을 별도로 체크해서 escaping을 하지 않으면,
    SQL Injection 을 당할수가 있지만,
    PreparedStatement는 set 메소드를 사용해서 입력값을 삽입할때
    알아서 escaping이 되어서 그런 위험이 없다는 것이죠.
    물론, 컴파일후에 삽입하는 형태가 아니고,
    query에 입력값까지 포함시켜 버리는 실수를 하면
    아무리 PreparedStatement를 써도
    SQL injection을 당할수 있으니 주의해야겠구요.

  2. 푸른컴돌 2012.02.07 13:13 신고

    너무나 좋은글인데.... 글씨가 짤려서 너무 아쉽습니다.

+ Recent posts