MyBatis 1탄 : https://pabeba.tistory.com/196
MyBatis 2탄 : https://pabeba.tistory.com/197
MyBatis 3탄 : https://pabeba.tistory.com/198
4탄 찐막하겠습니다. 객체 안에 객체가 있는 VO(Value Object)가 있다고 가정해 봅시다.
영화 테이블과 영화감독 테이블이 있으면
MovieVO 안에 DirectorVO가 있을 것입니다.
Resultmap 사용하여 리스트 불러오기
<MovieVO.java>
public class MovieVO {
private long movieId;
private String title;
private String genre;
private long attendance;
private DirectorVO directorVO;
public MovieVO() {
super();
}
...............중략
}
<DirectorVO.java>
public class DirectorVO {
private long directorId; // column name : director_id => 설정으로 자동 매핑
private String directorName; // 자동 매핑
private String intro;
public DirectorVO() {
super();
}
......중략
}
이런 식으로 VO를 만들어줍니다.
영화 list를 불러오는 test 코드를 작성해 보겠습니다.
<TestFindMovieList.java>
public class TestFindMovieList {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring-mybatis-config.xml");
MovieMapper mm = (MovieMapper) ctx.getBean("movieMapper");
List<MovieVO> list = mm.findMovieList();
for (MovieVO movie : list) {
System.out.println("감독 이름 : " + movie.getDirectorVO().getDirectorName());
}
System.out.println(list);
ctx.close();
}
}
mapper.xml 파일에 SQL 문을 작성해 보겠습니다.
<MovieMapper.xml>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="myproject.model.mapper.MovieMapper">
<resultMap type="myproject.model.vo.MovieVO"
id="movieListRM">
<result property="directorVO.directorName"
column="director_name" />
</resultMap>
<resultMap type="myproject.model.vo.MovieVO"
id="detailMovieRM" extends="movieListRM">
<id property="directorVO.directorId" column="director_id" />
<result property="directorVO.intro" column="intro" />
</resultMap>
<select id="findMovieList" resultMap="movieListRM">
SELECT m.movie_id, m.title, m.genre, m.attendance, d.director_id,
d.director_name, d.intro FROM movie m INNER JOIN director d ON
d.director_id = m.director_id
</select>
</mapper>
여기서부터 설명이 필요합니다.
근데 코드가 워낙 직관적이기 때문에 금방 알 수 있습니다.
resultMap을 두 개로 나눈 이유는 extends를 사용하기 위함입니다.
1. 감독 이름 resultMap으로 넣기
<resultMap type="myproject.model.vo.MovieVO" id="movieListRM">
<result property="directorVO.directorName" column="director_name" />
</resultMap>
<resultMap> 안에 내용을 작성합니다.
type - movieVO 안에 넣을 것이기 때문에 넣어주는 대상 객체를 type에 작성합니다.
id - 그냥 이름을 작명해 줍니다.
이렇게만 해도
<select id="findMovieList" resultMap="movieListRM">
SELECT m.movie_id, m.title, m.genre, m.attendance, d.director_id,
d.director_name, d.intro FROM movie m INNER JOIN director d ON
d.director_id = m.director_id
</select>
감독의 이름을 넣을 수 있습니다.
결과 값을 resultMap으로 만들어 놓은 movieListRM을 넣어주면 됩니다.
결과 값
MovieVO [movieId=1, title=설국열차, genre=SF, attendance=100, directorVO=DirectorVO [directorId=0, directorName=봉준호, intro=null]]
MovieVO [movieId=2, title=기생충, genre=스릴러, attendance=1000, directorVO=DirectorVO [directorId=0, directorName=봉준호, intro=null]]
MovieVO [movieId=3, title=살인의 추억, genre=스릴러, attendance=2000, directorVO=DirectorVO [directorId=0, directorName=봉준호, intro=null]]
보시면 감독 이름만 잘 들어가고 다른 변수들은 값이 들어가지 않았습니다.
extends 하여 새로운 resultMap 값 생성하기
DirectorVO에 있는 아이디와 into 도 넣기 위해서 extends를 사용해서 넣어보겠습니다.
<resultMap type="myproject.model.vo.MovieVO" id="detailMovieRM" extends="movieListRM">
<id property="directorVO.directorId" column="director_id" />
<result property="directorVO.intro" column="intro" />
</resultMap>
이전에 사용했던 movieListRM의 문장을 extends 해서 작성한다는 의미입니다.
값을 넣는 것은 같습니다.
이렇게 하고
<select id="findMovieList" resultMap="detailMovieRM">
SELECT m.movie_id, m.title, m.genre, m.attendance, d.director_id,
d.director_name, d.intro FROM movie m INNER JOIN director d ON
d.director_id = m.director_id
</select>
resultMap 값에 detailMovieRM을 넣게 되면?
결과 값
MovieVO [movieId=1, title=설국열차, genre=SF, attendance=100, directorVO=DirectorVO [directorId=1, directorName=봉준호, intro=아카데미 수상]]
MovieVO [movieId=2, title=기생충, genre=스릴러, attendance=1000, directorVO=DirectorVO [directorId=1, directorName=봉준호, intro=아카데미 수상]]
MovieVO [movieId=3, title=살인의 추억, genre=스릴러, attendance=2000, directorVO=DirectorVO [directorId=1, directorName=봉준호, intro=아카데미 수상]]
보시면 아이디, 이름, 설명이 잘 들어가게 됩니다.
소감
이렇게 MyBatis 기초에 대한 알아보기가 끝났습니다.
설정파일만 잘 작성하고 이해한다면 나머지 뒤에 있는 문장들은 자연스럽게 알 수 있습니다. 설정 값이 추상적인 것이지
SQL 문을 실행하는 것들은 개발자를 위해 너무 편하게 만들어져 있다고 생각됩니다.
다음 시간에는 Spring MVC에 대하여 알아보겠습니다. (매우 복잡)
'코딩 개발 > Spring' 카테고리의 다른 글
Spring Legacy - javaconfig 로 Dynamic Web 실행하기 (0) | 2023.07.16 |
---|---|
Spring MVC 이해하기 - JUnit, 웹 프로그램 실행 (Spring legacy) (0) | 2023.07.14 |
MyBatis 3탄 - @Mapper, sql include, ![CDATA[]], selectKey, || (0) | 2023.07.12 |
MyBatis 2탄 - SqlSessionTemplate, XML config (0) | 2023.07.11 |
MyBatis 1탄 - Configuration, Annotation, SqlSessionFactory 로 실행하기 (0) | 2023.07.10 |