📔 개요
현재 진행중인 프로젝트에서는 mssql, Oracle 등 다양한 종류의 database를 사용하고 있다.
mssql에서 데이터 타입이 'ntext'인 컬럼을 조회하는 SQL문을 실행했는데 HashMap에 매핑되지 않는 현상이 발생했다.
원인 파악에 도움을 받았는데 Mybatis 설정 중에 varchar로 받아내게 하는 부분이 존재했고, ntext형식의 데이터를 varchar 형식으로 매핑하려니 문제가 생긴 것이다.
이를 어떻게 해결할까 고민하다가 resultMap을 이용하기로 했다.
📚 ResultMap이란?
복잡한 결과 매핑을 간편하게 만들어주기 위해 만들어진 태그다.
📕 예제 1
일반적인 Mybatis의 매핑 구문은 다음과 같다.
<select id="selectUsers" resultType="map">
select id, username, hashedPassword
from some_table
where id = #{id}
</select>
resultType이 map인 것을 보아 {key, value}일 때 {"id",id값}, {"username",username값}, {"hashedPassword",hashedPassword값} 이 매핑될 것을 예상할 수 있다.
📒 예제 2
아래와 같은 User 객체가 있다고 가정해보자
@Getter @Setter
public class User {
private int id;
private String username;
private String hashedPassword;
}
Mybatis의 resultType을 User 객체로 바꾸어주었다.
<select id="selectUsers" resultType="User객체경로.User">
select id, username, hashedPassword
from some_table
where id = #{id}
</select>
User객체의 필드명과 selectUsers의 조회 컬럼명이 일치하므로 쉽게 매핑된다.
📘 예제 3
하지만 쿼리문이 아래와 같이 달라진다면 이야기가 달라진다.
<select id="selectUsers" resultType="User객체경로.User">
select user_id, user_name, hashed_password
from some_table
where id = #{id}
</select>
물론 AS 키워드를 이용해서 매핑할 수는 있다.
하지만 (그럴 일은 없겠지만) 필드명이 자주 바뀐다거나, 매칭되는 타입(number -> String)이 다른 경우에는 매핑할 수 없게 된다.
이 때 사용하게 되는 것이 ResultMap이다.
아래와 같은 ResultMap을 적용해본 코드를 보자.
<resultMap id="testMap" type="User객체경로.User">
<result column="user_id" property="id" jdbcType="NVARCHAR" javaType="String"/>
<result column="user_name" property="username" jdbcType="NVARCHAR" javaType="String"/>
<result column="hashed_password" property="hashedPassword" jdbcType="NVARCHAR" javaType="String"/>
</resultMap>
<select id="selectUsers" resultMap="testMap">
select user_id, user_name, hashed_password
from some_table
where id = #{id}
</select>
user_id는 resultMap을 통해 User 객체의 id에 매칭된다.
jdbcType이나 javaType도 지정이 가능하다.
(다양한 옵션이 존재하니 공식 홈페이지를 참고 바란다. 글 하단의 참고 1 링크)
📌 유사한 문제
데이터 형식 varbinary을(를) text(으)로 명시적으로 변환할 수 없습니다.
👉 binary를 text로 convert 할 경우 발생. null 또는 ''의 경우 binary로 인식하기 때문
참고
'Develop > CS' 카테고리의 다른 글
[Oracle] SQL문으로 주말 구하기 (1) | 2021.08.30 |
---|---|
[Oracle] ORA-01476: 제수가 0 입니다. (0) | 2021.08.09 |
[Oracle] 인덱스에서 누락된 IN 또는 OUT 매개변수:: (2) | 2021.08.02 |
[Windows] hosts 파일 수정하기 (0) | 2021.07.19 |
[Mybatis] java.sql.SQLException: 해당 위치에 지원되지 않는 SQL92 토큰 에러 (0) | 2021.07.09 |