PreparedStatement vs Statement vs CallableStatement

pjiavark·2022년 6월 29일
0

java database

목록 보기
2/3

Statement

  • SQL 구문을 실행하는 역할
  • Statement는 만들어진 쿼리를 전달하는 역할

Query에 문자열 넣을 때 ''를 꼭 넣어줘야함

Statement stmt = con.createStatement();

ResultSet res = stmt.excuteQuery("SELECT * FROM table_name WHERE id = '1234'");

stmt.close();
con.close();
// 동적으로 쿼리를 만들 때
String id = "1234";
ResultSet res = stmt.excuteQuery("SELECT * FROM table_name WHERE id = '" + id + "'");

PreparedStatement

DBMS 수행 순서

  1. 구문 분석, 정규화 단계
    Query 문법 분석·테이블과 컬럼이 존재하는지 확인
  2. 컴파일 단계
    쿼리 컴파일
  3. 쿼리 최적화 계획
    쿼리 최적화
  4. 캐시
    3단계에서 캐시에 저장이 됨.
    그래서 동일한 쿼리가 들어오게 되면 Cache에 있는 Query를 찾아 실행
  5. 실행 단계
    Query 실행, 데이터 반환

 

caceh 사용

컴파일 될 때 미리 Cache에 데이터를 저장해 놓음
그리고 실행될 때 '?'를 찾아서 바인딩해준다.
바인딩 된 다음에는 쿼리 구문 분석및 컴파일하지 않음

? 바인딩

PreparedStatement pstmt = null;
String id = "1234";
pstmt = con.prepareStatement("SELECT * FROM WHERE id = ?");
pstmt.setString(1, id);
// -> 만들어진 쿼리 : SELECT * FROM table_name WHERE id = '1234'

SQL에 들어가는 ?를 setMethod에서 값을 치환

parameter 1번째 int는 ?의 몇번째 값에 넣을 지 정하는 것
0부터 시작이 아니라 1부터 시작

setMethod
setString(int, String)
setByte(int, byte)
setShort(int, short)
setInt(int, int)
setLong(int, long)
setFloat(int, float)
setDouble(int, double)
setBigDecimal(int, BigDecimal)
setObject(int, Object)
setArray(int, Array)
setDate(int, Date)
setTime(int, Time)
setTimestamp(int, Timestamp)
..등등..

CallableStatement


프로시저 호출 전용
이거는 나중에 정리함
내가 프로시저 자체를 완벽이해 못했음...


정리

  • Statement
    • 기본적인 SQL쿼리 실행
    • 동적 쿼리 사용시 사용 -> 하지만 SQL Injection 때문에 추천 안함
  • PreparedStatement
    • Statement + cache
    • 쿼리 반복 수행시 사용
  • CallableStatement
    • PreparedStatement + Procedure

참고

0개의 댓글