자바(Java)/JAVA 2SE

Statement객체와 PreparedStatement 객체 쿼리문 작성시 주의점

본클라쓰 2009. 11. 26. 10:20

 

 Statement 객체는 SQL문 작성을 문자열 형태로 작성한다. 하지만 PreparedStatement 객체는 IN 매개변수를 통해 SQL문을 작성한다. 또한, IN 매개변수는 SQL문장에서 하나의 완전한 문자열로 취급된다. SQL문에 LIKE 키워드를 사용하여 SQL문을 작성 할 때 패턴을 정의 하는 방법에서 이 두개는 다른 형태로 SQL문을 정의한다.

 

만약, 다음과 같은 쿼리문이 있다면 

 

String sql = "SELECT * FROM table WHERE name LIKE '홍%';

 

 위의 쿼리문은 해당 테이블에서 이름이 '홍'으로 시작되는 모든 레코드를 추출하는 쿼리문이다. 이 부분을 데이터베이스에 명령창에서 실행하면 완벽하게 추출된 데이터를 반환한다.

 

하지만, PreparedStatement 객체를 사용하여 다음과 같이 작성하면 오류가 발생한다.

 

String sql = "SELECT * FROM table WHERE name LIKE '?';

pst = conn.prepateStatement(sql);

pst.setString(1, "홍%"); 

 

 출력값을 하나도 얻을 수 없다. 이유는 PreparedStatement 객체는 IN 매개변수를 완전한 문자열로 보기 때문에 데이터베이스에서 '홍%'  값을 패턴으로 보든 것이 아니라 그 자체의 문자열로 본다. 즉, 테이블에서 '홍%' 이란 이름을 가진 레코드가 있나를 검색한다.

 

따라서 패턴을 입력하고 싶을 때 Statement 객체를 사용하여 SQL문을 작성한다.

 

String sql = "SELECT * FROM table WHERE name LIKE '"+"홍"+"%';"

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 객체를 사용해야 한다.

String sql = "SELECT upfrontMonth, sbf FROM member WHERE "+name+" = "+nameValue;
stm = conn.createStatement();
rs = stm.executeQuery(sql);

 

'자바(Java) > JAVA 2SE' 카테고리의 다른 글

java.text.SimpleDateFormat - 날짜 형태  (0) 2010.01.04
자바의 I/O 스트림  (0) 2009.12.27
Java 시스템 변수 설정  (0) 2009.11.19
JDK 설치 방법 - J2SE, J2EE 개발 가능  (0) 2009.11.19
JAVA 개발 환경  (0) 2009.11.19