>

종종 네트워크에서 다음과 같은 코드를 찾을 수 있습니다.

private static final String SQL = "SELECT * FROM table_name";
....

이 SQL 쿼리에는 PreparedStatement가 사용됩니다. 왜요?
내가 아는 것처럼, PreparedStatement는 SQL 문을 사전 컴파일하는 데 시간을 보냅니다. Statement가 PreparedStatement보다 빠르다는 것이 밝혀졌습니다. 아니면 내가 틀렸어?

  • 답변 # 1

    준비된 명령문은 다른 데이터로 동일한 명령문을 여러 번 실행해야 할 때 훨씬 빠릅니다. SQL은 쿼리를 한 번만 유효성 검사하기 때문에 명령문을 사용하면 매번 쿼리를 유효성 검증합니다.

    PreparedStatements를 사용하면 얻을 수있는 또 다른 이점은 SQL 주입 취약점이 발생하지 않도록하는 것입니다.

    질문의 경우 준비된 명령문과 명령문의 차이점은 무시할 만합니다.

    편집 : 아래의 의견에 따라 DAO 클래스를 면밀히 검토하여 수행중인 작업을 확인해야합니다. 예를 들어, 메소드가 호출 될 때마다 준비된 명령문을 다시 작성하면 준비된 명령문을 사용하면 아무런 이점이 없습니다.

    원하는 것은 영속 계층을 캡슐화하여 MySQL 또는 Postgres 또는 사용중인 모든 것을 호출하지 않고 동시에 준비된 것들의 성능 및 보안 이점을 활용하는 것입니다. 진술. 이렇게하려면 PreparedStatement와 같은 Java 자체 객체를 사용해야합니다.

    저는 Hibernate와 Java Persistence API를 사용하여 CRUD 작업을 수행하기 위해 자체 DAO 클래스를 직접 작성하여 모든 것을 캡슐화하고 보안 이점을 위해 준비된 명령문을 사용해야합니다. 반복적 인 작업을 수행하기위한 특정 사용 사례가있는 경우 해당 객체를 자체 객체로 감싸는 경향이 있습니다.

    최대 절전 모드는 XML 파일을 통해 사용중인 데이터베이스 공급 업체를 사용하도록 구성 할 수 있으므로 지속성 계층을 실제로 깔끔하게 캡슐화 할 수 있습니다. 그러나 올바른 결과를 얻는 것은 매우 복잡한 제품입니다!

  • 답변 # 2

    대부분의 쿼리는 예제만큼 간단하지 않습니다. 쿼리에 변형 (예 : 컴파일 타임에 알려지지 않은 매개 변수)이있는 경우 SQL 주입 취약점을 피하기 위해 PreparedStatement를 사용해야합니다. 이것은 성능 문제에 우선합니다. PreparedStatement와 Statement 사이에 차이가있는 경우, 해당 JDBC 드라이버에 따라 크게 달라지며 대부분의 경우 데이터베이스로 이동하여 실제 쿼리를 실행하고 결과를 다시 가져 오는 비용과 비교하여 패널티가 무시할 수 있습니다.

  • 답변 # 3

    Faster는 여기서 고려되지 않습니다. SQL 파싱은 일반적으로 전반적인 실행의 작은 부분이 될 것입니다. 명령문 대신에 PreparedStatement를 언제 사용해야합니까?를 참조하십시오.

  • 답변 # 4

    내 지식에 따라PreparedStatement는 명령문보다 훨씬 빠릅니다. 다음은 준비된 진술이 더 빠른 이유보다 자세한 내용을 읽어보십시오.
    JDBC API는 데이터베이스와의 연결 기능을 제공합니다. 그런 다음 statement와 readystatement를 사용하여 쿼리를 실행하려고합니다.
    쿼리를 실행하는 4 단계가 있습니다.

    와이즈 비즈

    문 인터페이스는 쿼리를 여러 번 실행할 필요가 없을 때 적합합니다.

    문장 인터페이스의 단점. 해커는 쉽게 데이터를 해킹 할 수 있습니다. 사용자 이름과 암호가있는 매개 변수가 하나 인 쿼리가 있다고 가정하면 적절한 매개 변수를 제공 할 수있는 매개 변수는 username='abc@example.com '이고 password ='abc123 '실제로 이것은 현재이지만 해커는 username ='abc @ example.com '또는'1 '= 1 and password =' ​​'는 성공적으로 로그인 할 수 있음을 의미합니다. 성명서에서 가능합니다.
    그리고 SQL은 데이터베이스에서 데이터를 가져올 때마다 유효성을 검사합니다.

    그래서 Java에는 위의 문제인 PreparedStatement에 대한 솔루션이 있습니다. 이 인터페이스에는 많은 장점이 있습니다. readystatement의 주요 장점은 SQL이 매번 쿼리를 검증하지 않는다는 것입니다. 결과를 빠르게 얻을 수 있습니다. 아래에서 준비된 진술의 장점을 더 읽으십시오.

    1) setter 메소드를 사용하여 쿼리 매개 변수의 값을 안전하게 제공 할 수 있습니다. 2) 자동으로 특수 문자를 이스케이프하므로 SQL 삽입을 방지합니다. 3) 위의 명령문을 사용할 때마다 4 단계가 실행될 때마다 PreparedStatement를 사용할 때 마지막 단계 만 실행되므로 명령문보다 빠릅니다.

    Parsing of sql query.
    Compile this Query.
    optimization of data acquisition path.
    execute the query.

  • 이전 out of memory - 많은 경우에도 javalangOutOfMemoryError
  • 다음 security - 돌이킬 수없는 자바 데이터 파괴