본문 바로가기
일상/일기장

TIL22.03.01 - MyBatis : ResultMap

by jmaster 2022. 2. 28.

resultMap

resultMap 엘리먼트의 하위 엘리먼트 선언 순서

constructor > id >result> association> collection> discriminaotr

?:0개 또는 1개

*:0개 이상

cache : SELECT 명령의 검색결과를 Cache 메모리에 저장하여 빠른 검색결과를 제공하는 엘리먼트

→INSERT, UPDATE, DELETE 명령이 실행되면 Cache 메모리에 저장된 검색결과는 자동 초기화

→검색결과를 저장하는 클래스는 반드시 객체 직렬화 클래스로 설정

객체 직렬화를 하기위해 Serialrize 클래스를 상속 받아야한다.

객체 직렬화 클래스 : Serializable 인터페이스를 상속받는 클래스

→객체 단위로 입력 또는 출력을 위한 클래스 선언하는 방법

discriminator : 검색행의 컬럼값을 비교하여 다른 매핑정보를 제공하기 위한 상위 엘리먼트

→ 하위 엘리먼트 : case 엘리먼트

javaType 속성 : 비교 컬럼값에 대한 java 자료형을 속성값으로 설정

column 속성 : 비교 컬럼값이 저장된 컬럼명을 속성값으로 설정

case : 검색행의 컬럼값을 비교하여 같은 경우 매핑 정보를 제공하기 위한 엘리먼트

value 속성 : 검색행의 컬럼값과 비교할 값을 속성값으로 설정

권한을 통해 다른 값을 보여주기 위해서 사용

공통적인 매핑정보는 discriminator 엘리먼트가 아닌 다른 엘리먼트를 이용하여 매핑 처리

extends 속성 : resultMap 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정

→resultMap 엘리먼트의 매핑정보를 상속받아 사용

SQL 명령에 필요한 값을 전달받는 방법

→ 전달값은 SQL 명령에서 #{변수명|필드명|맵키} 형식으로 표현

1.XML 맵퍼에서 SQL 명령이 등록된 엘리먼트의 parameterType 속성값으로 Java 자료형(별칭)을 이용하여 값을 전달받아 사용

→parameterType 속성값으로 기본형(Wrapper) 또는 String 클래스를 설정

→parameterType 속성값으로 DTO 클래스 설정 - 다수값(필드명)

→parameterType 속성값으로 HashMap 클래스(Map 인터페이스) 설정 - 다수값(맵키)

2.Interface 맵퍼에서 추상메소드의 매개변수 Param 어노테이션을 설정하여 값을 전달받아 XML 맵퍼의 엘리머트에 등록된 SQL 명령에서 전달값 사용

→XML 맵퍼의 SQL 명령이 등록된 엘리먼트에서는 parameterType 속성 생략

select 엘리먼트의 resultType 속성값을 HashMap 클래스(Map 인터페이스)로 설정하면 검색행의 컬럼명은 맵키로 컬럼값은 맵값으로 매핑하여 엔트리로 저장하여 검색결과 제공 ㄸ

interface 맵퍼 추상매개변수에 저잔달된 값을 @Param 어노테이션의 value 속성값을 #{속성값}으로 표현

@ param : 추상메소드의 매개변수에 저장된 값을 XML 맵퍼의 엘리먼트에 등록된 SQL 명령에 사용할 수 있도록 제공하는 어노테이션

→ value 속성 : SQL 명령에서 매개변수

검색 컬럼명과 검색 단어를 전달받아 MYHEWON 테이블에 저장된 회원정보 중 검색 컬럼에 검색 단어가 저장된 회원정보를 검색하여 검새결과를 제공하는 엘리먼트.

resultMap상속

값을 전달하는 방법

Map으로 반환하는 방법ㅈ

resultMap 엘리먼트의 하위 엘리먼트 선언 순서

  • constructor >> id >> result >> association >> collection >> discriminator

resultMap 주의사항

  • association 엘리먼트로 매핑 설정을 시작한 경우 내부적으로 모든 매핑 설정을 selectOne() 메소드로 단일행의 검색결과를 제공받아 매핑 처리

→문제점)resultMap 엘리먼트에서 association 엘리먼트로 매핑 설정을 시작한 경우에 collection 엘리먼트를 선언하면 다수행의 검색결과에 대한 매칭 처리 불가능(TooManyResultsException 발생)

→해결법)resultMap 엘리먼트에서 association 엘리먼트가 아닌 다른 엘리먼트로 매핑이 시작되도록 설정

<resultMap type="MyCommentReplyUser" id="myCommentReplyUserResultMap">
		<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 property="user" javaType="MyUser">
		<id column="user_id" property="userId"/>
		<result column="user_name" property="userName"/>
	</association>
	<collection property="replies" ofType="MyReplyUser">
		<association property="reply" javaType="MyReply">
			<id column="reply_no" property="replyNo"/>
			<result column="reply_id" property="replyId"/>
			<result column="reply_content" property="replyContent"/>
			<result column="reply_date" property="replyDate"/>
			<result column="reply_comment_no" property="replyCommentNo"/>
		</association>
		<association property="user" javaType="MyUser">
			<id column="reply_user_id" property="userId"/>
			<result column="reply_user_name" property="userName"/>
		</association>
	</collection>
</resultMap>

댓글