본문 바로가기
Web

데이터베이스 프로그래밍 기초 (3)

by jaee_ 2021. 9. 28.
본 글을 📚 최범균의 JSP2.3 웹 프로그래밍 을 읽고 정리한 글입니다. 

 

1.1 Statement를 이용한 쿼리 실행 시 작은 따옴표 처리

SQL 쿼리를 실행할 때 값에 작은따옴표가 들어가면 작은따옴표 두 개를 사용하는 형태로 변경해야 한다. 예를들어 "King's choice"와 같이 작은따옴표가 들어간 값으로 컬럼 값을 변경해야 할 경우 다음처럼 작은 따옴표를 두 개 사용해야 한다. 

update TABLENAME set SOMEFIELD = 'king"s choice' where ...

String 클래스의 replaceAll()을 사용해서 치환하는 방법도 있다. 하지만 PreparedStatement를 사용하면 이런 치환 없이 따옴표가 포함된 것을 사용할 수 있다. 

 

1.2 PreparedStatement를 사용한 쿼리

java.sql.PreparedStatement는 java.sql.Statement와 동일한 기능을 제공한다.  차이점은 PreparedStatement는 SQL 쿼리의 틀을 미리 생성해 놓고 값을 나중에 지정한다는 것이다. PreparedStatement 를 사용하는 순서는 다음과 같다. 

  • Connection.preparedStatment() 메서드를 사용하여 PreparedStatement 생성
  • PreparedStatement 의 set 메서드를 사용하여 필요한 값 지정
  • PreparedStatement 의 executeQuery() 또는 executeUpdate() 메서드를 사용하여 쿼리를 실행
  • finally 블록에서 사용한 PreparedStatement 를 닫음(close() 메서드 사용)
PreparedStatement 를 생성할 때에는 실행할 쿼리를 미리 입력하는데, 이 때 다음과 같이 값 부분을 물음표("?")로 대치한 쿼리를 사용한다.

insert into MEMBER (MEMBERID, NAME, EMAIL) values (?,?,?);

PreparedStatement 의 객체를 생성한 다음에는 PreparedStatement 가 제공하는 set메서드를 이용하여 물음표를 대체할 값을 지정해주어야 한다. 예를들면 다음과 같이 각각의 물음표에 들어갈 값을 지정한다. 

ps.setString(1,"study");
ps.setString(2,"yeoonjae");

이 때 첫 번쨔 물음표의 인덱스는 1이며, 이후 물음표는 순서대로 인덱스 값이 1씩 증가한다.

 

 

PreparedStatement 클래스가 제공하는 set 메서드

메서드 설명
setString(int index, String x) 지정한 인덱스의 파라미터 값을 x로 지정한다.
setCharacterStream(int index, Reader reader, int length) 지정한 인덱스의 파라미터 값을 LONG VARCHAR 타입의 값으로 지정할 때 사용한다. Reader는 값을 읽어올 스트림이며, length는 지정한 문자열의 길이를 나타낸다.
setInt(int index, int x) 지정한 인덱스의 파라미터 값을 int 값 x로 지정한다.
setLong(int index, long x) 지정한 인덱스의 파라미터 값을 double 값 x로 지정한다.
setFloat(int index, float x) 지정한 인덱스의 파라미터 값을 float 값 x로 지정한다.
setTimestamp(int index, Timestamp x) 지정한 인덱스의 파라미터 값을 TIMESTAMP 타입을 타나내는 java.sql.Timestamp 타입으로 지정한다.
setDate(int index, Date x) 지정한 인덱스의 값을 SQL DATE 타입을 나타내는 java.sql.Date 타입으로 지정한다.
setTime(int index, Time x) 지정한 인덱스의 값을 SQL TIME 타입을 나타내는 java.sql.Time 타입으로 지정한다.

 

  • ResultSet executeQuery() : SELECT 쿼리를 실행할 때 사용하며 ResultSet을 결과값으로 리턴한다.
  • int executeUpdate() : INSERT, UPDATE, DELETE 쿼리를 실행할 때 사용하며, 실행 결과로 변경된 레코드의 개수를 리턴한다.

 

1.3 PreparedStatement 쿼리를 사용하는 이유

Statement 쿼리 대신 PreparedStatement 쿼리를 사용하는 주된 이유는 다음과 같다. 

  • 값 변환을 자동으로 하기 위해
  • 간결한 코드를 위해 

PreparedStatement를 사용할 때 장점은 값 변경을 하지 않아도 된다는 점이다. 1.1 에서 설명한 글을 보면 알겠지만 중간에 작은 따옴표가 들어간 값을 처리할 때 작은따옴표를 두번 사용하는 형태로 변경해줘야 했었다. PreparedStatement는 setString() 을 호출할 때 알아서 값을 변경해주기 때문에 작은따옴표를 변경할 필요가 없다. 작은따옴표를 치환해주는 과정이 없으니 당연히 코드도 간결해진다.

이러한 장점때문에 검색 조건과 같이 값을 지정해야하는 쿼리를 실행할 때에는 PreparedStatement를 선호한다. 

댓글