프로그래밍/J2EE

[정보] PreparedStatement 예제

투칼론 2016. 10. 7. 16:21
반응형

JDBC 프로그래밍에는 Statement, Prepared Statement, Callable Statement 3가지 유형이 있다. 가장 많이 사용하는 Prepared Statement에 대해 설명하고자 한다.



1. Prepared Statement의 특징 및 장점


JDBC API를 통해 DB 접근 시에 Preapared Statement 또는 Statement를 통하여 로직을 작성한다. Prepared Statement는 Statement와 같은 아래와 같은 특징 및 장점이 있기 때문에 조건문이 바뀌지 않고, 조건값이 바뀌는 경우(캐슁 장점 활용) 사용을 권장한다.


  • PreparedStatement는 Statement를 상속받아 구현한 객체임
  • SQL statement에 대한 파싱과 컴파일이 필요한데, 사전에 컴파일된 Statement 임
  • 성능이 Statement 보다 빠르고, SQL 재사용성이 높음
  • setXXX() 메소드를 통해 구현하면, SQL 인젝션 등과 같은 보안 위협 이슈에 보다 안전한 시큐어코딩 가능함


2. Prepared Statement 관련 파라미터

    각 WAS에서는 캐쉬되는 Statement  갯수를 지정할 수 있도록 Cache size를 지정할 수 있음
    예를 들어, WebLogic은 Statement_Cache_Size 파라미터를 제공함


    주의할 사항은 Cache된 Statement는 DB의 CURSOR를 open하고 있기 때문에, cache size에 따라 DB 파라미터 중에서 open된 cursor의 최대 크기를 고려해야 함



    3. 소스 예시

      PreparedStatement 소스 예제는 다음과 같다.


      PreparedStatement pstmt;

      ...


      pstmt = connection.prepareStatement("INSERT INTO emp (id, name, dept) VALUES (?, ?, ?)");

      pstmt.setString(1, emp.getId());

      pstmt.setString(2, emp.getName());

      pstmt.setString(3, emp.getdept());

      pstmt.executeUpdate();


      ...



      4. Statement, Callable Statement 예시


        참고1) Statement 소스 예제

        Statement stmt;

        ...


        String sql = "{call getEmpName (?, ?)}";

        stmt = connection.createStatement(sql);

        stmt.setInt(1, 100);

        stmt.setString(2, "01");

        stmt.execute();


        ...


        위의 예제처럼 SQL 문장에 변수값을 포함하여 문자열을 만들어 SQL을 수행한다.

         


        참고2) Callable Statement 소스 예제

        CallableStatement stmt;

        ...


        stmt = connection.prepareStatement();

        stmt.executeUpdate("INSERT INTO emp (id, name, dept) VALUES ( '" + emp.getId() + "', '" + emp.getName()  "', '" + emp.getdept() + "')");


        ...


        위의 예제처럼 SQL 문장에 변수값을 포함하여 문자열을 만들어 SQL을 수행한다.



        '프로그래밍 > J2EE' 카테고리의 다른 글

        [Tips] JDBC 쿼리(Query) 타임아웃 설정  (0) 2021.09.03
        [정보] HttpServletResponse 객체  (0) 2021.02.08
        [정보] HttpServletRequest 객체  (0) 2021.02.08
        [정보] SSO 구현 방식  (0) 2019.01.28
        [개요] REST 이해  (0) 2018.01.27