Statement와 PreparedStatement의 차이점

3010 단어
Statement
Statement 객체는 Connection 방법을 사용하여 createStatement를 만듭니다.
Connection con = DriverManager.getConnection(url, "sunny", "");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");

 
PreparedStatement
하나.코드의 가독성과 유지보수성. 
Prepared Statement로 Statement를 대체하면 코드를 몇 줄 더 만들 수 있지만, 이러한 코드는 읽을 수 있든 유지할 수 있든 상관없다.Statement를 직접 사용하는 코드보다 여러 단계 높습니다.
 
stmt.executeUpdate( "insert   into   tb_name   (col1,col2,col2,col4)   values   ( ' "+var1+ "', ' "+var2+ "', "+var3+ ", ' "+var4+ "') "); 
 
perstmt = con.prepareStatement( "insert   into   tb_name   (col1,col2,col2,col4)   values   (?,?,?,?) "); 
perstmt.setString(1,var1); 
perstmt.setString(2,var2); 
perstmt.setString(3,var3); 
perstmt.setString(4,var4); 
perstmt.executeUpdate(); 
 
 
둘.PrepareStatement는 사전 컴파일러로서 대량 처리에 있어 운영 효율을 크게 높일 수 있습니다.
모든 데이터베이스는 사전 컴파일된 문장에 대해 최대의 성능 최적화를 제공하기 위해 최선을 다할 것이다.사전 컴파일된 문장이 중복 호출될 수 있기 때문이다.따라서 문장이 DB의 컴파일러에 의해 컴파일된 실행 코드가 캐시되면 다음에 호출될 때 같은 사전 컴파일러라면 컴파일할 필요가 없고, 컴파일된 문장의 실행 코드에 파라미터를 직접 전송하기만 하면 (하나의 함수에 해당하는) 실행될 수 있다.
이것은 하나의 연결에서 여러 번 실행된 미리 컴파일된 문장만 캐시된다는 것이 아니라, 전체 DB에서 미리 컴파일된 문장의 문법과 캐시가 일치하기만 하면 된다.그러면 언제든지 다시 컴파일하지 않고 바로 실행할 수 있습니다.
 
1. 사용하는 SQL 문구가 일회성이라면 Statement를 사용하는 것이 좋다. 왜냐하면 이렇게 하면 PrepareStatement를 사용하면 큰 효과가 나타나지 않고 반대로 성능 면에서 Statement보다 못할 수도 있기 때문이다. PrepareStatement 대상의 비용이 Statement보다 크기 때문이다.
 
2. Statement는 매번 SQL 문장을 실행할 때마다 관련 데이터베이스에서 SQL 문장을 컴파일해야 하고PrepareStatement는 필요하지 않다.
 
3. 많은 SQL 문장을 실행하는 JDBC 프로그램은 대량의Statement와PreparedStatement 대상을 생성한다.일반적으로 Prepared Statement 대상이 Statement 대상보다 더 효과적이라고 여긴다. 특히 서로 다른 파라미터가 있는 같은 SQL 문장이 여러 번 실행될 때.PreparedStatement 대상은 데이터베이스에서 SQL 문장을 미리 컴파일할 수 있도록 함으로써 다음 실행에서 시간을 절약하고 코드의 가독성을 높일 수 있습니다.
 
셋.가장 중요한 것은 안전성을 크게 향상시켰다는 것이다. 
 
지금까지도 일부 사람들은 기본적인 악의인 SQL 문법조차 모른다. 
String  sql = "select * from tb_name where name= ' "+varname+ " ' and passwd= '"+varpasswd+ "'"; 

 
만약 우리가 ['or'1'='1]을varpasswd로 들어오면.사용자 이름 마음대로 하세요. 뭐가 될지 볼까요? 
 
select   *   from   tb_name = 임의 and passwd = or 1 = 1; 
'1'='1'은 틀림없이 성립되기 때문에 어떠한 검증도 통과할 수 있다.
 
더 심한 경우: [;drop table tb name;]varpasswd로 들어오면:
select * from tb_name = '  ' and passwd =  '';drop table tb_name;

어떤 데이터베이스는 당신을 성공하게 하지 못하지만, 또한 많은 데이터베이스가 이 문장들을 집행할 수 있다. 
 
만약 당신이 미리 컴파일한 문장을 사용한다면.네가 보낸 어떤 내용도 원래의 문장과 일치하는 관계가 없을 것이다.(전제는 데이터베이스 자체가 사전 컴파일을 지원하지만 이전에 서버 데이터베이스가 컴파일을 지원하지 않을 수도 있고 소수의 데스크톱 데이터베이스만 직접 파일에 접근할 수 있다)
사전 컴파일된 문장을 모두 사용하기만 한다면, 너는 전송된 데이터에 대해 어떠한 지나친 걱정도 할 필요가 없다.일반statement를 사용하면drop에 대해심혈을 기울인 판단과 과려를 기다리다.

좋은 웹페이지 즐겨찾기