티스토리 뷰

Database/DATABASE

[MyBatis] #, $ 차이

구글링쟁이 k9e4h 2017.06.15 11:49

http://lng1982.tistory.com/246



# => 쿼리문을 실행하기에 앞서 구문 분석, 의미 분석, 파싱 작업을 진행하여 SQL Injection 코드를 만나게 되면 오류 발생함 (SQL Injection 대비 가능)

$ => 쿼리 실행시마다 옵티마이저의 수행 계획 달라짐


여기서 유념해야 할 부분은 # 을 사용했을 때에는 ? 으로 치환이 되는 반면에 $ 를 사용한 케이스에서는 ${testId} 영역에 100이라는 상수로 치환되어 쿼리를 수행하게 된다.

중요한 포인트는 101, 102, 103 과 같이 숫자가 바뀔 때마다 파싱 작업을 항상 진행해야 한다라는 것이다.

성능상에 단점이 존재한다라는 것을 알 수 있다.


mybatis

select * from TestTable

where testId = #{testId}


생성된 쿼리

select * from TestTable

where testId = ? 

= > testId의 형식?type에 맡게 들어감, 숫자면 숫자로, string이면 '~~'로


mybatis

select * from TestTable

where testId = ${testId}


생성된 쿼리

select * from TestTable

where testId = 100


http://tip.daum.net/question/58690260

#{} 문법은 iBatis가 PreparedStatement에 대한 Property를 생성하고 안전하게 값을 설정하도록 합니다.

대신 입력된 문자열을 수정해야 하기 때문에 조금 느립니다.


${} 문법은 문자열을 수정하지 않고, PreparedStatement parameter(?에 매핑)에 

직접 문자열을 집어 넣습니다. 따라서 조금 더 빠르죠.



JDBC에서는 쿼리를 재사용 할수 있느냐 없느냐의 문제가 될꺼구요.

DB에서는 플래닝을 다시할 필요가 있느냐 없느냐의 문제가 될것입니다.


http://www.donnert.net/65


'Database > DATABASE' 카테고리의 다른 글

[MySql] OUTER JOIN에서 On과 Where 조건  (0) 2017.08.25
[MySql] INSTR  (0) 2017.08.03
[MyBatis] #, $ 차이  (1) 2017.06.15
SQL에서 행을 열로 바꾸는 방법  (0) 2017.05.15
[myBatis] include refid - 반복되는 쿼리 묶기  (0) 2017.05.12
[MYSQL] 빈 ROW 생성  (0) 2017.03.30
댓글
댓글쓰기 폼