위의 emp는 dept의 deptno를 외래키로 참조하는 테이블이다.
내부조인 : select * from dept left outer emp e join on d.deptno = e.deptno;
외부조인 : select * from dept d left outer join emp e on d.deptno = e.deptno;
와 같이 SQL쿼리를 사용하여 조인할 수 있다.
이렇게 값을 얻어서 VO에 넣어서 저장하기가 애매(?)할 수가 있다.
Mybatis를 이용하여 조인을 처리하여 VO의 저장할 수 있는 방법이 있다.
collection은 1:多관계에서 쓰이는 방법으로 부모의 레코드를 뽑아내면서 해당 레코드를 참조하는 자식의 레코드들을 뽑아낼 수 있다. -> 어떻게보면 이중포문과 비슷하다고 생각이 들 수 있다.
사용하게되는 태그 resultMap과 select면 된다.
resultMap은 select태그의 속성 중 resultMap이라는 속성이 존재한다.
resultMap을 먼저 선언한 뒤, select에서 참조하는 방법이다.
<!-- 조인 시 VO가 두개의 컬럼을 감당할 수 있어야함... -->
<!-- 쿼리결과와 객체간 매핑을 자동으로 하는 것이 아니라,
개발자가 주도하여 처리를 하고 싶을때는 별도의 매핑을 선언.. -->
<!-- 매핑의 커스터마이징 -->
<resultMap type="Dept" id="deptJoinEmp">
<!-- column=query에서 뽑아진 컬럼명 -->
<id column="deptno" property="deptno"/><!-- primary key -->
<result column="dname" property="dname"/><!-- 일반컬럼 -->
<result column="loc" property="loc"/>
<!-- 부서정보가져오고 부서정보에 포함되는 외부에 있는 부서원정보가져오기-->
<!-- Emp(ofType)로 구성된 List(javaType)-->
<!-- deptno컬럼을 가져오겠다. -->
<!-- propery는 set메서드를 생각 -->
<collection column="deptno" javaType="java.util.List" ofType="Emp" select="Emp.select" property="empList"/>
</resultMap>
<!-- 이중포문과 비슷 dept정보를 가져올 때 그 정보를 가지고 emp정보를 가져오고 다음 dept가져오면 그 dept에 대한 emp를 뽑아온다. -->
<select id="selectAll" resultMap="deptJoinEmp">
select deptno, dname, loc from dept
</select>
resultMap은 매핑을 개발자가 커스터마이징하여 내가 만든 VO에 맞게 조인할 수 있다.
resultMap태그의 속성 중 type은 만들 VO객체를 말하고 id는 select에서 참조할 수 있게 이름을 지어주는 것이다.
id는 테이블의 primary key를 매핑하는 것이고, result는 일반 컬럼들을 매핑하는 것이다.
위 태그의 속성 중 column은 쿼리로 뽑아배는 레코드의 컬럼을 말하고, property는 VO객체의 set메서드를 말한다.
collection의 속성 중 javaType은 만들 자료형을 말하고 ofType은 javaType이 List와 같은 제네릭형일 때 자료형을 정해준다. select는 자식의 Mapper에서의 사용할 쿼리id를 말한다.
<resultMap id="empJoinDept" type="Emp" >
<id column="empno" property="empno"/><!-- primary key -->
<result column="ename" property="ename"/>
<result column="job" property="job"/>
<result column="mgr" property="mgr"/>
<result column="hiredate" property="hiredate"/>
<result column="sal" property="sal"/>
<result column="comm" property="comm"/>
<!-- 자식관점에서는 부모와 1:1 관계로 가져옴 -->
<association column="deptno" property="dept" javaType="Dept" select="Dept.selectById"/>
</resultMap>
<!-- 사원테이블 정보 가져오기 -->
<select id="selectAll" resultMap="empJoinDept">
select * from emp
</select>
association은 1:1관계에서 사용할 수 있는 조인이다. 즉, 자식이 참조하고 있는 컬럼에 대한 부모레코드를 참조할 수 있다.
위 collection 이해할 수 있다면 association을 쉽게 이해할 수 있다.
'프로그래밍 > Spring' 카테고리의 다른 글
Spring - ServletContext 쉽게 가져오기 (0) | 2021.01.05 |
---|---|
Spring | AOP (0) | 2020.12.23 |
Spring - DI (0) | 2020.12.22 |