새소식

반응형
Java/Spring

[sql] statement 와 preparedStatement

  • -
반응형

Statement

자바에서 정적 쿼리문을 수행할 때 java.sql 패키지에 있는 Statement 인터페이스를 사용하게 된다.

Statement 객체에 Connection 되어 있는 곳에 쿼리문을 수행하고 결과를 반환한다.

 

Statement 는 아래와 같은 동작 순서를 가진다.

1. SQL 쿼리문 분석

2. 쿼리문 컴파일

3. 실행

 

아래는 예시이다.

int seq = 3;
String sql_str = "SELECT name FROM test_table WHERE seq = " + se
String url = "jdbc:mysql://localhost:3306/DB명";
String username = "DB 계정 ID";
String password = "DB 계정 PW";

Connection conn = DriverManager.getConnection(url, username, password);

Statement stmt = conn.credateStatement(); 
ResultSet rst = stmt.executeQuery(sql_str); 

위와 같이 sql_str 에 쿼리문을 설정하고 Statement 객체를 생성해 executeQuery() 를 실행하는 시점에

쿼리문을 전달하게 된다. 이러한 쿼리문은 아래와 같이 원본 그대로 SQL 쿼리문을 수행하게 된다.

SELECT name FROM test_table WHERE seq = 3

Statement 객체를 사용한 쿼리문은 매번 1~3 과정을 거치게 되고 아래에서 설명할 PreparedStatement 보다

성능이 안좋다.

특히나 자주 사용되고 반복되는 쿼리문을 사용한다고 했을 때 매번 seq 값이 달라지므로

쿼리문을 실행할때 마다 1~3번 과정을 거치게 된다.

 

PreparedStatement

PreparedStatement 는 이름에서 알수 있듯이 준비된 Statement 이다.

int seq = 3;
String sql_str = "SELECT name FROM test_table WHERE seq = ?"
String url = "jdbc:mysql://localhost:3306/DB명";
String username = "DB 계정 ID";
String password = "DB 계정 PW";
Connection conn = DriverManager.getConnection(url, username, password);

PreparedStatement pstmt = conn.prepareStatement(sql_str);
pstmt.setInt(1, seq);

ResultSet rst = pstmt.executeQuery();

준비라는건 컴파일 과정을 얘기한다. Statement 와 달리 원본 그대로 쿼리문을 날리는게 아닌 쿼리문에

바인딩 될 데이터 위치에 (?) 값을 두어 컴파일 한다. 이러한 컴파일한 데이터는 캐시에 저장해놓고

쿼리문을 실행하기전 (?) 위치에 값을 바인딩하여 쿼리문을 실행한다.

 

Statement 와 달리 컴파일 과정이 없으므로 성능이 좋다.

 

 

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.