1. 오류 발생
-
프로젝트 진행 중 returnType="HashMap"으로 넘길 시에 조회가 되지 않는 오류 발생했고 두 가지의 해결 방법을 찾았다.
- 첫 번째 방법(권장) : resultMap 사용하기
- 두 번째 방법 : DTO와 데이터베이스의 컬럼이 정확히 일치하면 HashMap으로 넘길 시에 List로 받더라도 자동 매핑이 되지만, 그게 아닐 때는 키값을 이용하여 넣어주면 된다. (키 값은 Iterator를 통하여 값에 접근)
2. 첫 번째 방법 : ResultMap 사용하기
-
ResultMap은 DB 컬럼명과 DTO의 변수 명이 다를 때 사용한다.
- resultMap 선언
- id = 사용할 id 명
- resultMap type= DTO명
- column = DTO 변수 명
- property = 데이터베이스 컬럼 명
- select 문에서 사용
- resultMap="resultMap의 id명"
- resultMap 선언
-
예제 코드
-
USER.xml
<resultMap id="UserList" type="User"> <result column="userId" property="USER_ID"> <result column="userName" property="USER_NAME"> </resultMap> <select id="userList" resultMap="UserList"> select \* from USER </select>
-
3. 두 번째 방법 : Iterator 란?
- Iterator는 자바의 컬렉션 프레임웍에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화하였는데 그중 하나가 Iterator이다.
- 자세한 설명 : https://vaert.tistory.com/108
- 예제 코드
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
// DTO와 DB가 일치하지 않으므로 HashMap List 사용
// Post 자리에는 사용될 객체 이름을 넣어주면 된다. ( 저는 임의로 Post 사용! )
List<HashMap<Object, Post>> result = sqlSession.selectList(NS+"searchPost");
// 가져온 객체들을 저장해서 반환 할 새로운 배열을 선언
List<Post> list = new ArrayList<Post>();
// 받아온 HashMap List를 HashMap에 차례로 넣어준다.
for(HashMap<Object, Post> hash : result){
// Hash의 value값을 조회 할 key값 가져오기
Set key = hash.keySet();
// Iterator에 key를 담는다.
Iterator iterator = key.iterator();
// list에 하나씩 담아 줄 새로운 객체 생성
Post post = new Post();
// setter 사용
// iterator.next()를 통하여 값을 접근한다.
post.setTitle(hash.get(iterator.next()).toString());
post.setContent(hash.get(iterator.next()).toString());
// setter를 통하여 값을 다 넣어준 후에는 list에 추가해주기
list.add(post);
// hasNext를 통해 다음 KEY값들의 모음으로 넘어간다.
}
return list;
}
4. 기타 기억할 점
- 가져오는 값이 Int형일 경우 Integer.parseInt(가져올 값)
- 그 외 형 변환 오류 발생시 (가져올 값). getClass(). getName()으로 자료형 확인해서 맞춰주기