마이바티스 결과 매핑
1) 조회 결과를 자바 객체에 설정(결과 매핑)
보통 데이터베이스를 사용할 경우 조회 후 결과를 객체에 담아 사용합니다.
결과를 화면에 노출 시킬 때는 JSP파일을 이용합니다.
그에 대응하는 모델 클래스가 존재하거나 여러 개 테이블 대상으로 데이터를 가져오고
한꺼번에 여러 개 모델 클래스에 값을 설정하는 다양한 상황이 존재합니다.
이를 처리하기 위해서 마이바티스는 결과 매핑(Result Mapping)이라는 테크닉을 사용합니다.
부가적으로 mapUnderscoreToCamelCase설정도 함께 사용하게 됩니다.
칼럼명과 일치하지 않거나 별도로 값을 설정하는 규칙을 정의해야하만 정확히 값을 설정할 수 있습니다.
먼저 결과 매핑을 위한 XML 엘리먼트는 아래와 같습니다.
- resultMap 결과 매핑 사용하는 가장 상위 엘리먼트. id 속성과 매핑 클래스 정의하는 type속성을 가집니다.
- id 기본 키에 해당
- result 기본 키가 아닌 나머지 컬럼에 대한 매핑
- constructor setter 메서드나 리플렉션을 통해 설정하지 않고 생성자를 통해 값을 설정
- association 1:1관계 처리
- collection 1:N관계 처리
- discriminator 매핑 과정에서 조건 지정하여 값 설정
한 개 테이블 사용하는 결과 매핑에 대해 간단하게 살펴봅시다.
댓글 테이블만을 조회한다는 말입니다.
간단한 매핑 구문으로써
<select id="selectCommentByPrimaryKey" parameterType="long" resultMap="BaseResultMap">
SELECT
comment_no,
user_id,
comment_content,
reg_date
FROM COMMENT
WHERE comment_no=#{commentNo}
</select>
결과매핑을 쓰지 않는 매핑구문 과의 차이점은 resultMap 속성입니다. 기존은 resultType을 썼지만
이번 코드는 resultMap을 사용합니다.
또한 별칭도 쓰지 않습니다.
별칭이란 comment_no as commentNo 등을 말합니다.
이를 위해 결과 매핑을 보자면
<resultMap id="BaseResultMap" type="ldg.mybatis.model.Comment">
<id column="comment_no" jdbcType="BIGINT" property="commentNo"/>
<result column="user_id" jdbcType="VARCHAR" property="userId"/>
<result column="reg_date" jdbcType="TIMESTAMP" property="regDate"/> <result column="comment_content" jdbcType="VARCHAR" property="commentContent"/> </resultMap>
즉 column에 컬럼명을 쓰고
id에는 해당 기본키
result에는 해당 기본키 제외 컬럼들을 써주면 됩니다.
jdbcType에는 DB상에서의 type을 써주면 됩니다.
property에는 필드명을 써줍니다.
2) 생성자를 통한 객체 생성과 설정(constructor 엘리먼트 매핑)
id나 result를 통해 위에서 처럼 설정합니다.
최근에 코드의 품질을 높이기 위해서 여러 가지 디자인 패턴을 적용합니다.
불변 패턴이 있는데요.
불변 객체를 사용한다는 뜻입니다.
불변이라는 뜻은 여러분들도 잘 알고 있습니다.
변하지 않는 즉, 변경이 불가능하다 라는 뜻입니다.
생성자를 생성해서 객체를 생성할 때 값을 설정해야 합니다.
constructor라는 엘리먼트를 제공하고 있습니다.
우선 불편 클래스를 봅시다.
@SuppressWarnings("serial")
public class Comment implements Serializable {
private final Long commentNo;
private final String userId;
private final Date regDate;
private final String commentContent;
public Comment(Long commentNo, String userId, Date regDate, String commentContent) {
this.commentNo = commentNo;
this.userId = userId;
this.regDate = regDate;
this.commentContent = commentContent;
}
public Long getCommentNo() {
return commentNo;
}
public String getUserId() {
return userId;
}
public Date getRegDate() {
return regDate;
}
public String getCommentContent() {
return commentContent;
}
}
위에서 setter는 없고 getter만 있습니다. 즉 변경 못한다는 뜻이죠.
즉 객체가 생성되고 나면 바꿀 수 없기 때문입니다.
이를 결과 매핑하려면 constructor 앨리먼트를 사용합니다.
<resultMap id="constructorResultMap" type="ldg.mybatis.model.Comment">
<constructor>
<idArg column="comment_no" javaType="long" />
<arg column="user_id" javaType="string" />
<arg column="reg_date" javaType="date" />
<arg column="comment_content" javaType="string" />
</constructor>
</resultMap>
생성자처럼 설정하고자 하는 컬럼을 순서대로 해주면 됩니다.
idArg와 arg는 생성자의 파라미터를 설정합니다.
주의사항은 순서가 동일해야합니다.
또한 setter와 함께 사용할 수 있습니다.
<resultMap id="constructorResultMap" type="ldg.mybatis.model.Comment">
<constructor>
<idArg column="comment_no" javaType="long" />
<arg column="user_id" javaType="string" />
</constructor>
<result column="reg_date" jdbcType="TIMESTAMP" property="regDate"/>
<result column="comment_content" jdbcType="VARCHAR" property="commentContent"/>
</resultMap>
이렇게 result 엘리먼트는 setter메소드를 호출하면 되겠습니다.
다음 포스팅은 association 에릴먼트에 대해 알아보도록 하겠습니다.
감사합니다.
'데이터베이스 > 마이바티스' 카테고리의 다른 글
@Param 하나의 객체와 일반 타입 변수 (0) | 2019.07.15 |
---|---|
마이바티스 활용 (0) | 2019.01.23 |
마이바티스 CRUD(삭제) (0) | 2019.01.09 |
마이바티스 CRUD(수정) (0) | 2019.01.07 |
마이바티스 CRUD(삽입) (0) | 2019.01.04 |