Database

[MyBatis] #, $ 차이

k9e4h 2017. 6. 15. 11:49

 

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://www.donnert.net/65

 

Mybatis #과 $의 차이

PrepareStatment(#)와 Statment($)를 정확히 모르고 사용하시는 분들이 있어 정리해봤습니다.  - 간혹 Statment를 숫자일때 사용한다.. 라고 생각하시는 분들고 계시고 정확한 의미를 모르는 분들이 계십니

www.donnert.net

java119.tistory.com/39

 

[MyBatis] #{} 와 ${} 개념과 차이점

궁금은 했지만 알아보기 귀찮은 #{} 와 ${} 개념과 차이점을 아주 명확하고 확실하게 알아보도록 하겠습니다. 먼저 PreparedStatement 와 Statement를 알아야 한다. 간단하게 할게요;; 간 단 하 게 PreparedSta

java119.tistory.com

http://lng1982.tistory.com/246

 

MyBatis 샾(#) 달러($) 차이

select * from TestTable where testId = #{testId} MyBatis에서 위와 같은 쿼리문을 실행하게 되면 database에서는 아래 쿼리문에 대한 의미, 구문 분석 및 파싱 작업을 진행하게 된다. select * from TestTable..

lng1982.tistory.com

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