mybatis를 사용할 때, parameterMap 및 parameterType, resultMap 및 resultType을 선언하여 사용한다. 이 친구들에 대해 알아보도록 하자.
간단하게 정리하면 다음과 같이 정리할 수 있다.
- 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>
'Java > mybatis' 카테고리의 다른 글
mybatis 오류 / attempted to return null from a method with a primitive return type (int) (0) | 2021.10.18 |
---|