업무/공부
[iBatis, JDBC] parameterClass, parameterMap, PreparedStatement, $, # (MyBatis parameterType)
60cod
2022. 12. 14. 10:31
parameterClass
- 해당 클래스를 직접 명시
- parameterClass 속성값은 자바 클래스의 패키지를 포함한 전체 경로 이름이다.
- parameterClass 속성은 옵션이지만 추천되는 사용 방법
- statement에 전달하는 파라미터를 제한하는 데 사용된다.
예)
parameterMap
- 넘어온 파라미터를 parameterMap에 재배치하여 해당 Map의 값으로 매핑한다.
- PreparedStatement의 값 토큰과 매치되는 정렬된 파라미터 목록 명시
- parameterMap에 명시된 순서대로 statement에 대응된다.
예)
iBatis parameterMap에서 MyBatis로 변경하는 방법
MyBatis에서는 parameterMap을 사용하지 않는다. 변경하는 방법은 아래 글 참고
PreparedStatement
- 동일하거나 비슷한 SQL문을 효율적으로 처리하는 기능
- 동작 방식
- 준비 → 컴파일 → 변수 바인딩 → 샐행 단계
- 준비 단계에서는 인자 ?를 사용하여 쿼리 작성 (Statement와의 차이점1)
- 가독성과 효율성 좋아짐.
- ex) insert into xxx (xxx) values (?, ?)
- 컴파일 후 실행 단계에서는 PreparedStatement 객체가 값을 바인딩하고 SQL 실행
- 처음 한 번만 1~3 단계를 거친 후, 캐시에 담아 재사용한다. 매번 컴파일 되지 않는다. (차이점2)
- 동일 쿼리를 반복적으로 수행한다면 PreparedStatement가 성능에 좋다.
- execute를 따로 해야 한다. (차이점3)
Statement
- 위 PreparedStatement1~4 단계를 계속해서 반복 사용
- ?를 사용하지 않아서 넣어야 할 데이터가 많아지면 쿼리가 지저분해진다.
- 캐시를 사용하지 않는다.
MyBatis 달러($), 샾(#) 동작 원리
- #{} 사용 → 쿼리문에 물음표(?)가 생기고, PreparedStatement를 생성하여 파라미터를 바인딩한다.
- PrepareStatement를 사용함으로써 파싱된 쿼리문은 캐시에 담아 재활용하므로 성능이 좋아진다.
- 쿼리에 작은 따옴표가 붙게 된다.
- ${} 사용 → 값이 넣어진 채로 쿼리문이 만들어지고 수행된다.
- 파라미터 값이 바뀔 때마다 쿼리문 파싱이 이루어져야 하며, 캐시 활용이 안 돼서 성능 상 단점이 있다. 즉, Statement를 사용하면 성능 상의 이슈가 있다.
- 문자열을 직접 삽입하기 때문에 SQL Injection 문제에 취약하다.
- #은 값에 사용하고, $는 컬럼명/테이블명이 동적으로 바뀌어야 할 때 사용한다.
- 값에 $를 사용하면 스트링의 경우 작은 따옴표로 감싸지지 않기 때문에 에러가 발생한다.
resultType
- select된 결과 값을 저장하기 위한 데이터 타입 지정
parameterType
- 전달받은 파라미터 데이터 타입 지정 (선택적)