2021.03.17 업데이트)
# => Prepared Statement (동적)
쿼리문을 실행하기에 앞서 구문 분석, 의미 분석, 파싱 작업을 진행하여 SQL Injection 코드를 만나게 되면 오류 발생함 (SQL Injection 대비 가능)
$ => Statement (정적)
쿼리 실행시마다 옵티마이저의 수행 계획 달라짐
여기서 유념해야 할 부분은 # 을 사용했을 때에는 ? 으로 치환이 되는 반면에 $ 를 사용한 케이스에서는 $ 영역에 100이라는 상수로 치환되어 쿼리를 수행하게 된다.
중요한 포인트는 101, 102, 103 과 같이 숫자가 바뀔 때마다 파싱 작업을 항상 진행해야 한다라는 것이다.
성능상에 단점이 존재한다라는 것을 알 수 있다.
변수로 인식하지 않게하기 위해서 #{param} 을 '${param}' 으로 사용하기도 한다.
mybatis code
select * from TestTable where testId = #
생성된 쿼리
select * from TestTable where testId = ?
= > testId의 컬럼 타입에 맡게 들어감, 숫자면 숫자로, string이면 '~~'로
mybatis code
select * from TestTable where testId = $
생성된 쿼리
select * from TestTable where testId = 100
#{} 문법은 myBatis가 PreparedStatement에 대한 Property를 생성하고 안전하게 값을 설정하도록 합니다.
대신 입력된 문자열을 수정해야 하기 때문에 조금 느립니다.
${} 문법은 문자열을 수정하지 않고, PreparedStatement parameter(?에 매핑)에 직접 문자열을 집어 넣습니다. 따라서 조금 더 빠르죠.
JDBC에서는 쿼리를 재사용 할수 있느냐 없느냐의 문제가 될꺼구요.
DB에서는 플래닝을 다시할 필요가 있느냐 없느냐의 문제가 될것입니다.
https://blog.naver.com/mittchan/220030192267
http://lng1982.tistory.com/246
http://tip.daum.net/question/58690260
'Database' 카테고리의 다른 글
[MySql] OUTER JOIN에서 On과 Where 조건 (0) | 2017.08.25 |
---|---|
[MySql] INSTR (0) | 2017.08.03 |
SQL에서 행을 열로 바꾸는 방법 (0) | 2017.05.15 |
[myBatis] include refid - 반복되는 쿼리 묶기 (1) | 2017.05.12 |
[MYSQL] 빈 ROW 생성 (0) | 2017.03.30 |