본문 바로가기
Backend/mybatis

[mybatis]resultMap 하위 엘리먼트 -association 엘리먼트

by sukii 2024. 3. 8.
반응형

id/result 엘리먼트를 사용한다는건 검색행의 값을 바로 필드에 저장한다는 것이다! 

그러니까 아래와 같이 DTO 파일을 확인해 봤을 때, 컬럼명마다 변수가 모두 선언되어 있다는 뜻이다.

 

그러나 만약 아래와 같이 필드에 객체를 저장해야만 하는 dto 클래스는 id/result 엘리먼트를 사용해 필드에 저장이 안된다.

이럴 때 사용할 수 있는 것이 association 엘리먼트!

 



🔸association : 1:1 관계의 테이블 조인에서 검색행의 컬럼값으로 객체를 생성하여 resultMap 엘리먼트의 type 속성값으로 설정된 클래스의 객체 필드에 저장하는 엘리먼트 
=> 하위 엘리먼트 : id 엘리먼트 또는 result 엘리먼트를 사용하여 검색행의 컬럼값을 association 엘리먼트로 생성된 객체 필드에 저장되도록 설정
▪️ property 속성 : association 엘리먼트로 생성된 객체가 저장된 클래스의 필드명을 속성값으로 설정
▪️ javaType 속성 : association 엘리먼트로 생성된 객체의 Java 자료형을 속성값으로 설정
=> Java 자료형 대신 typeAlias 엘리먼트로 설정한 별칭(AliasName) 사용 가능

 

▶️아래 select 문을 보면 mycomment 테이블과 myuser 테이블을 조인하고 있음. 이 때,

mycomment 테이블에서 검색되는 내용들은 myComment1 으로 객체를 생성하여 comment  필드에 저장해야하고, myuser 테이블에서 검색되는 내용들은 myUser로 객체를 생성하여 user 필드에 저장해야하므로 

resultMap 엘리먼트 안에 두개의 association 엘리먼트를 사용하여 작성해준다.

<resultMap type="MyCommentUser2" id="myCommentUser2ResultMap">
		<!-- mycomment 테이블에서 가져온 데이터는 MyComment1 객체로 매핑되어야 하며,
        comment 필드에 저장 -->
        <association property="comment" javaType="MyComment1">
			<id column="comment_no" property="commentNo"/>
			<result column="comment_id" property="commentId"/>
			<result column="comment_content" property="commentContent"/>
			<result column="comment_date" property="commentDate"/>
		</association>
		
        <!-- myuser 테이블에서 가져온 데이터는 MyUser 객체로 매핑되어야 하며, user 필드에 저장 -->
		<association property="user" javaType="MyUser">
			<id column="user_id" property="userId"/>
			<result column="user_name" property="userName"/>
		</association>
	</resultMap>
	
	<select id="selectCommentUserList2" resultMap="myCommentUser2ResultMap">
		select comment_no, comment_id, comment_content, comment_date, user_id, user_name
			from mycomment join myuser on comment_id=user_id
			order by comment_no desc
	</select>

 

 

만약 1:N 관계의 테이블을 조인하여 List 객체를 반환해야 한다면? ⬇️

2024.03.10 - [Java/mybatis] - [mybatis]resultMap 하위 엘리먼트 -collection 엘리먼트

 

반응형