Statement객체와 PreparedStatement 객체 쿼리문 작성시 주의점
Statement 객체는 SQL문 작성을 문자열 형태로 작성한다. 하지만 PreparedStatement 객체는 IN 매개변수를 통해 SQL문을 작성한다. 또한, IN 매개변수는 SQL문장에서 하나의 완전한 문자열로 취급된다. SQL문에 LIKE 키워드를 사용하여 SQL문을 작성 할 때 패턴을 정의 하는 방법에서 이 두개는 다른 형태로 SQL문을 정의한다.
만약, 다음과 같은 쿼리문이 있다면
위의 쿼리문은 해당 테이블에서 이름이 '홍'으로 시작되는 모든 레코드를 추출하는 쿼리문이다. 이 부분을 데이터베이스에 명령창에서 실행하면 완벽하게 추출된 데이터를 반환한다.
하지만, PreparedStatement 객체를 사용하여 다음과 같이 작성하면 오류가 발생한다.
String sql = "SELECT * FROM table WHERE name LIKE '?';
pst = conn.prepateStatement(sql);
pst.setString(1, "홍%");
출력값을 하나도 얻을 수 없다. 이유는 PreparedStatement 객체는 IN 매개변수를 완전한 문자열로 보기 때문에 데이터베이스에서 '홍%' 값을 패턴으로 보든 것이 아니라 그 자체의 문자열로 본다. 즉, 테이블에서 '홍%' 이란 이름을 가진 레코드가 있나를 검색한다.
따라서 패턴을 입력하고 싶을 때 Statement 객체를 사용하여 SQL문을 작성한다.
stm = conn.createStatement();
rs = stm.executeQuery(sql);
이런 방식으로 쿼리문을 작성하여 실행하면 원하는 결과를 얻을 수 있다.
PreparedStatement 객체의 IN 매개변수를 사용하여 SELECT 같은 SQL문을 대신할 수 없다.
다음과 같은 문장도 오류를 발생한다.
String sql = "SELECT * FROM table WHERE ? = ?";
pst = conn.prepateStatement(sql);
pst.setString(1, "name");
pst.setString(2, "홍길동");
이럴 경우에는 Statement 객체를 사용해야 한다.
stm = conn.createStatement();
rs = stm.executeQuery(sql);