본 글을 📚 최범균의 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를 선호한다.
'Web' 카테고리의 다른 글
데이터베이스 프로그래밍 기초 (2) (0) | 2021.09.28 |
---|---|
데이터베이스 프로그래밍 기초 (1) (0) | 2021.09.27 |
쿠키(Cookie)와 세션(Session)에 대해서 (정의, 차이점) (0) | 2021.09.19 |
[네트워크] 웹의 동작 원리(프로토콜의 이해) (0) | 2021.07.29 |
댓글