업무/공부

[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을 사용하지 않는다. 변경하는 방법은 아래 글 참고

https://yongku.tistory.com/entry/IBatis-parametermap%EC%97%90%EC%84%9C-MyBatis%EB%A1%9C-%EB%B3%80%EA%B2%BD%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

 


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

  • 전달받은 파라미터 데이터 타입 지정 (선택적)

 

 

 

 

 

출처: https://insanelysimple.tistory.com/356