mybatis / parameter & result - Map & Type

mybatis를 사용할 때, parameterMapparameterType, resultMapresultType을 선언하여 사용한다. 이 친구들에 대해 알아보도록 하자.

 

간단하게 정리하면 다음과 같이 정리할 수 있다.

  • parameterMap : 비즈니스 로직으로부터 전달 받은, SQL 구문에 사용될 매개변수를 담은 객체
  • parameterType : 비즈니스 로직으로부터 전달 받은, SQL 구문에 사용될 매개변수의 자료형
  • resultMap : 비즈니스 로직으로 반환할, 결과값을 담은 객체
  • resultType : 비즈니스 로직으로 반환할, 결과값의 자료형

 


 

[ parameterMap ] 정해진 형태를 갖춰 매개변수를 전달받을 때

필자는 VO를 사용하여 정해진 형태의 값들을 SQL 구문에 전달하여 사용할 때, parameterMap을 사용한다. parameterMap은 다음과 같이 사용할 수 있다.

<!-- parameterMap을 선언해줘야 한다. -->
<!-- parameterMap을 구분할 수 있는 id와 경로(type)를 설정해줘야 한다. -->
<parameterMap id="test_parameterMap" type="test.project.com.vo.testVO" />

<!-- 상단에서 선언한 parameterMap의 id를 적어준다. -->
<!-- resultType 또는 resultMap 선언이 필수적이나, 아래의 예시를 마저 보도록 하자. -->
<select id="testSelect" parameterMap="test_parameterMap">
    select *
    from testTable
    where 1=1
    and type = #{type}
    and use = #{use}
    and age = #{age}
</select>

 

주석으로 달아놓았다시피, resultType 또는 resultMap을 선언해야 select 결과값을 반환할 수 있다. insert 및 delete 구문은 resultType 또는 resultMap을 선언할 필요가 없다. 결과값은 숫자형으로 반환(성공한 구문당 1)된다. 지금은 parameterMap 사용 형태만 예시로 들었기에, 아래에 완전히 사용할 수 있는 예시를 따로 추가해놓겠다.

 


 

[ parameterType ] 하나의 변수를 매개변수로 전달받을 때

필자는 하나의 변수를 매개변수로 전달받아 SQL 구문에 사용할 때, parameterType을 사용한다. parameterType은 다음과 같이 사용할 수 있다.

<!-- 숫자형을 전달받아 사용할 때 -->
<select id="testSelect" parameterType="java.lang.Integer">
    select count(*)
    from testTable
    where 1=1
    and age = #{age}
</select>
<!-- 문자열을 전달받아 사용할 때 -->
<select id="testSelect" parameterType="java.lang.String">
    select name
    from testTable
    where 1=1
    and use = #{use}
</select>

 

만약 VO같이 정해진 형태를 갖춰 전달하는 것이 아니지만, 여러 값들을 전달해야 할 때에는 HashMap을 사용해도 된다.

<!-- 여러 변수를 전달할 때 -->
<select id="testSelect" parameterType="java.util.HashMap">
    select *
    from testTable
    where 1=1
    and use = #{use}
    and name = #{name}
    and age = #{age}
</select>

 

역시나 마찬가지로, resultType 또는 resultMap을 선언해야 select 결과값을 반환할 수 있다. insert 및 delete 구문은 resultType 또는 resultMap을 선언할 필요가 없다. 결과값은 숫자형으로 반환(성공한 구문당 1)된다. 지금은 parameterType 사용 형태만 예시로 들었기에, 아래에 완전히 사용할 수 있는 예시를 따로 추가해놓겠다.

 


 

[ resultMap ] 정해진 형태를 갖춰 반환할 때

필자는 VO 및 DTO를 사용하여 정해진 형태의 값들을 처리 할 때(ex. VO로 결과값을 담아온 후, DTO에 가공하여 담아 화면에 전달할 때) resultMap을 사용한다. resultMap은 다음과 같이 사용할 수 있다.

<!-- resultMap을 선언해줘야 한다. -->
<!-- resultMap을 구분할 수 있는 id와 경로(type)를 설정해줘야 한다. -->
<resultMap id="test_resultMap" type="test.project.com.vo.testVO" />

<!-- 상단에서 선언한 resultMap의 id를 적어준다. -->
<select id="testSelect" resultMap="test_resultMap">
    select *
    from testTable
    where 1=1
</select>

 


 

[ resultType ] 하나의 변수를 반환할 때

필자는 다수의 컬럼을 보유한 반환값이 아닌, Count와 같은 결과값을 반환할 때에는 resultType을 사용한다. resultType은 다음과 같이 사용할 수 있다.

<!-- 숫자형을 반환할 때 -->
<select id="testSelect" resultType="java.lang.Integer">
    select count(*)
    from testTable
    where 1=1
    and use = 'Y'
</select>
<!-- 문자열을 반환할 때 -->
<select id="testSelect" resultType="java.lang.String">
    select name
    from testTable
    where 1=1
    and use = 'Y'
    and seq = 52
</select>

 

resultType에 반환할 변수의 자료형을 적어주면 간단하게 사용할 수 있다. 만약 VO나 DTO같이 정해진 형태를 갖춰 반환하는 것이 아니지만, 여러 값들을 반환해야 할 때에는 HashMap을 사용해도 된다.

<!-- 여러 컬럼을 반환할 때 -->
<select id="testSelect" resultType="java.util.HashMap">
    select *
    from testTable
    where 1=1
    and use = 'Y'
</select>

 


 

parameter 및 result 종합 예시

1. parameterMap + resultMap

<!-- parameterMap 및 resultMap 선언 -->
<parameterMap id="test_parameterMap" type="test.project.com.vo.testParamVO" />
<resultMap id="test_resultMap" type="test.project.com.vo.testResultVO" />

<!-- 선언한 parameterMap 및 resultMap 설정 -->
<select id="testSelect" parameterMap="test_parameterMap" resultMap="test_resultMap">
    select
          name
        , id
        , age
        , dept
        , use
    from User
    where 1=1
    and dept = #{dept}
    and use = #{use}
</select>

 

2. parameterType + resultType

<!-- 전달 받을 parameterType 및 반환할 resultType 설정 -->
<select id="testSelect" parameterType="java.lang.Integer" resultType="java.util.HashMap">
    select
          name
        , id
        , age
        , dept
        , use
    from User
    where 1=1
    and dept = #{dept}
    and use = #{use}
</select>
728x90