[ MyBatis3 ] SQL Map XML 파일(resultMap-2)

* id , result

<id property ="id" column="post_id" />

<result property="subject" column="post_subject" />


>> 결과 매핑의 기본적인 형태, id와 result 모두 한개의 칼럼을 한개의 프로퍼티나 간단한 데이터 타입의 필드에 매핑한다.


* constructor


<constructor>

<idArg column="id" javaType="int"/>

<arg column="username" javaType="String" />

</constructor>


- 프로퍼티가 데이터전송객체(DTO) 타입 클래스로 작동한다.

- MyBatis는 private 프로퍼티와 private 자바빈 프로퍼티를 지원하지만 많은 사람들은 생성자 주입을 선호한다.


* association

<association property="author" column="blog_author_id" javaType='Author">

<id property="id" column="author_id" />

<result property="username" column="author_username"/>

</association>


- association 요소는 "has-one" 타입의 관계를 이룬다.

- association 매핑은 다른 결과와 작동한다. 값을 가져오기 위해 대상 프로퍼티를 명시한다.

- MyBatis는 관계를 정의하는 두가지 방법을 제공한다.

  • 내포된(Nested) Select : 복잡한 타입을 리턴하는 다른 매핑된 SQL구문을 실행하는 방법
  • 내포된(Nested) Result : 조인된 결과물을 반복적으로 사용하여 내포된 결과매핑을 사용하는 방법

- 관계를 위한 내포된 Select

<resultMap id ="blogResult" type="Blog">

<association property ="author" column ="blog_author_id" javaType = "Author" select="selectAuthor" />

</resultMap>


<select id="selectBlog" parameterType ="int" resultMap="blogResult">

SELECT * FROM ……..

</select>


<select id= "selectAuthor: parameterType="int" resultType="Author">

SELECT * FROM …….

</select>


>> 두개의 select 구문중 하나는 Blog를 로드하고 다른하나는 Author를 로드한다.

Blog의 resultMap은 author 프로퍼티를 로드하기 위해 "selectAuthor" 구문을 사용한다.

다른 프로퍼티들은 칼럼과 프로퍼티명에 일치하는 것들로 자동으로 로드 될 것이다.


이 방법은 간단한 반면, 큰 데이터나 목록에는 제대로 작동하지 않을 것이다.

이 방법은 "N +1 Select문제"으로 알려진 문제점을 가진다.

- 레코드의 목록을 가져오기 위해 하나의 sql구문을 실행한다.("+1"에 해당)

- 리턴된 레코드별로, 각각의 상세데이터를 로드하기 위해 select구문을 실행한다.("N"에 해당)


- 관계를 위한 내포된 Result


<select id ="selectBlog" parameterType="int" resultMap="blogResult">

select

B.id as blog_id,

B.title as blog_title,

B.author_id as blog_author_id.

A.id as author_id,

A.username as author_username,

A.bio as author_bio

from Blog B left outer join Author A on B.author_id = A.id

where B.id = #{id}

</select>


<resultMap id="blogResult" type="Blog">

<id property ="blog_id" column="id" />

<result property="title" column="blog_title" />

<association property ="author" column="blog_author_id" javaType ="Author" resultMap="authorResult" />

</resultMap>


<resultMap id="authorResult" type="Author">

<id property="id" column="author_id" />

<result property="username" column="author_user_name" />

<result property="bio" author_id = "author_bio" />

</resultMap>


>> id 요소는 내포된 결과 매핑에서 매우 중요한 역할을 담당한다.

결과중 유일한 것을 찾아내기 위한 한개 이상의 프로퍼티를 명시해야 한다.

가능하면 결과중 유일한 것을 찾아낼수 있는 프로퍼티를 선택해야 한다