본문 바로가기

- DB

[MyBatis] #, $ 차이

반응형

#(PreparedStatement 생성)
    * 쿼리 주입을 예방할 수 있어 보안 측면에서 용이, 사용자의 입력을 받는 경우에도 사용 가능
    * 변수를 바인드하여 사용하기 때문에 값이 변경되어도 같은 쿼리로 인식(캐싱)

mapper 쿼리 전달 실제 수행 쿼리
SELECT *
   FROM TEST
 WHERE ID = #{id}
      AND NAME = #{name}
SELECT *
   FROM TEST
 WHERE ID = ?
      AND NAME = ?
SELECT *
   FROM TEST
 WHERE ID = 11
      AND NAME = 'halfStorage'


$(Statement 생성)
    * 파라미터가 바로 출력
    * 입력된 값이 문자열이라도 쿼리문에서 ' '로 감싸지 않음
    * 테이블이나 컬럼명을 파라미터로 전달하고 싶을 때 사용
    * 쿼리 주입이 가능하여 사용자의 입력을 받는 경우에는 SQL Injection 발생
    * 값이 변경될 경우 다른 쿼리로 인식하여 파싱 등의 작업으로 속도 저하 우려

    * 해당 컬럼의 자료형에 맞춰 파라미터의 자료형이 변경 

mapper 쿼리 전달 실제 수행 쿼리
SELECT *
   FROM TEST
 WHERE ID = ${id}
      AND NAME = ${name}
SELECT *
   FROM TEST
 WHERE ID = 11
      AND NAME = halfStorage
SELECT *
   FROM TEST
 WHERE ID = 11
      AND NAME = halfStorage

 

* iBatis에서는 #id#, $id$로 사용됩니다.

반응형

'- DB' 카테고리의 다른 글

[Oracle, MySQL, MSSQL] PROCEDURE  (0) 2020.07.14
[MySQL] int(11), ZEROFILL  (0) 2020.07.14
[MySQL] Incorrect string value  (0) 2020.06.15
[Oracle, MySQL] 시간 계산  (0) 2020.04.10
[Oracle] ORA-12518: TNS:listener could not hand off client connection  (0) 2020.04.07