Programming/Database2009.01.05 13:21

PreparedStatement 와 Statement 의 차이점

   

1. Statement

     String sqlstr = "SELECT name, memo FROM TABLE WHERE num = " + num 
     Statement stmt = conn.credateStatement(); 
     ResultSet rst = stmt.executeQuerey(sqlstr);

   

2. PreparedStatement

     String sqlstr = "SELECT name, memo FROM TABLE WHERE num = ? " 
     PreparedStatement stmt = conn.prepareStatement(sqlstr); 
     pstmt.setInt(1, num);
     ResultSet rst = pstmt.executeQuerey();

   

위에서 보듯이 1.은 sqlstr를 실행시 결과값을 생성하게 되지만 2. 은 sqlstr 은 생성시에 실행한다고 볼 수 있습니다.

따라서, 2.와 같이 이용할 경우 해당 인자만 받아서 처리하는 구조로 갈 수 있는것입니다.
내부적으로 상세하게 뜯어 보지는 않았지만, 2.는 생성시 메모리에 올라가게 되므로
동일한 쿼리의 경우 인자만 달라지게 되므로, 매번 컴파일 되지 않아도 된다는 결론이 날듯 합니다.


그럼 여기서 API를 보시면..


public interface PreparedStatement extends Statement
프리컴파일 된 SQL 문을 나타내는 오브젝트입니다.

   

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

=> 주 : PreparedStatement 는 Statement를 상속받고 있습니다.

   

public interface Statement

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

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

그리고 FOR 문등을 통하여 동일한 SELECT 를 여러번 실행해야 하는 경우에는, 그 사용성에 볼때 2번이 훨씬 효과적이라고 볼 수 있습니다.

예를 든다면..

   


//공통

1. Statement

     String sqlstr = null; 
     Statement stmt = null; 
     ResultSet rst = null;

     FOR(int i=0; i< 100 ; i++){ 
          sqlstr = "SELECT name, memo FROM TABLE WHERE num = " + i 
          stmt = conn.credateStatement(); 
          rst = stmt.executeQuerey(sqlstr); 
     }

   

2. PreparedStatement

     String sqlstr = null; 
     PreparedStatement pstmt = null; 
     ResultSet rst = null;

     sqlstr = "SELECT name, memo FROM TABLE WHERE num = ? " 
     pstmt = conn.prepareStatement(sqlstr);

     FOR(int i=0; i< 100 ; i++){ 
          pstmt.setInt(1, i); 
          rst = pstmt.executeQuerey(); 

출처 : http://okjsp.pe.kr/bbs?act=VIEW&seq=56152&bbs=bbs3

Posted by namoney