MyBatis를 사용시 SQL 파라메터 매핑시 ${obj}, #{obj] 두가지 방식을 사용한다.
iBatis 에서는 $obj$, #obj# 을 사용한다.
큰 차이점은 ${obj} 을 사용시 파라메터 가 값이 아니라 문자열 그대로 SQL에 삽입되어 SQL을 완성하고, #{obj}는 파라메터를 컴파일이 완료되어 대기중인 SQL에 값으로 매핑된다.
즉, #{obj}의 경우 SQL구분을 형성하지 않으며, 대입되는 값으로서 사용되어진다. ${obj}의 경우 SQL의 일부가 된다.
값의 매핑, SQL구문의 Prepared Statement 로 컴피일된 SQL상에 ? 로 존재하면 나중에 전달된 값을 값으로 매핑한다.
사용시 간혹 아래와 같은 에러가 발생하는 경우가 있다.
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''5'' at line 10
매핑된 파라메터에 문자열 숫자가 전달된 것을 알수 있다. ''5''
숫자 5가 아니라 문자열 5가 전달된 것 (MariaDB매핑에서 파라메터 end에 문자열 5가 매핑될 경우
SELECT * FROM TEST_TBL LIMIT 0 , #{end}
위와 같은 경우 ${end}를 사용하면 해결될 수 있으나 SQL Injection에 취약하고 위험이 있으므로 해결 방안이 아니고, 파라메터의 타입을 전달시 숫자형으로 전달하도록 해야한다.
되도록 사용을 제한 하는 것이 좋다.
일반적으로 정렬등에 사용할 컬럼명을 조건에 따라 설정하는 용도로 사용할 수 있다.
.... order by ${column_name} desc, ${order_sentence}