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 와 달리 컴파일 과정이 없으므로 성능이 좋다.