728x90
예제 상황으로 학교에는 학생이 존재하고 학생마다 학생증을 하나씩 가지고 있다.
🤖 Association(has one)
Association은 has one 타입의 관계를 다룰 때 사용한다. 예를 들어 학생이; 가지고 있는 학생증은 학생 한 명만 가질 수 있다. 예를 들어 해당 학생증을 조회하려고 할 때 association 관계를 걸어서 같이 조회하면 다음과 같다.
class StudentCard {
...
Student student;
}
class Student {
int studentId;
...
}
우선 학생과 학생증은 1 : 1 관계이다.
<select id="selectStudent" resultType="Student">
SELECT student_id studentId, ... FROM student WHERE student_id = #{studentId}
</select>
<resultMap id="studentCardResult" type="com.xxx.StudentCard">
<association property="student" column="stuendId" javaType="Student" select="selectStudent"/>
</resultMap>
<select id="selectStudentCard" resultMap="studentCardResult">
SELECT ..., student_id studentId, ... FROM studentCard WHERE studentCard_id = #{studentCardId}
</select>
association 태그에 colume은 조회할 selectStudent의 파라미터로 전달되고 studentCard를 조회하면서 함께 student를 조회하여 StudentCard 인스턴스 안에 멤버 변수로 있는 Student 인스턴스의 내용도 채워지게 된다.
{
“studentCard_id”:”1”,
“student”:{
“studentId”: “1”,
“studentName” : “kim”,
“age”:”19”
}
.
.
.
}
이런식으로 학생증을 정보를 조회했을 때 학생 정보가 같이 반환된다고 생각하면 된다.
🤖 Collection (has many)
class School {
int schoolId;
List<StudentCard> studentCards;
...
}
class StudentCard {
int studentCardId;
Student student;
....
}
StudentCard(학생증)과 School(학교)은 1 :N 관계이다.
<resultMap id="schoolResult" type="School">
<collection property="studentCards" javaType="java.lang.ArrayList" column="schoolId" ofType="StudentCard" select="selectStudentCardId"/>
</resultMap>
<select id="selectStudentCards" resultType="StudentCard">
SELECT * FROM studentCard WHERE school_id = #{schoolId}
</select>
<select id="selectSchool" resultMap="schoolResult">
SELECT school_id schoolId, .... , FROM school WHERE school_id = #{schoolId}
</select>
collection 태그에 javaType으로 ArrayList로 지정해주고 해당 List의 Generic Type을 StudentCard로 지정해주었다. 이런 식으로 작성하면 학교를 조회하면 학교에 존재하는 학생증 정보를 List에 넣을 수 있다.
{
“school_id”:”1”,
“school_name : “kkk”,
“studentCards”:{
studentCard1:{
“studentCardId”: “1”,
},
studentCard2:{
“studentCardId”: “2”,
.
.
.
},
studentCard3:{
“studentCardId”: “3”,
.
.
.
},
.
.
.
}
}
위처럼 조회 시 학교에 포함된 학생증 인스턴스도 포함되어 표시된다.
728x90
'Dev > Database' 카테고리의 다른 글
| [MYBATIS] choose 절을 이용한 DynamicSQL (0) | 2022.03.03 |
|---|---|
| [MYSQL] MYSQL Partition - 테이블 분할 (0) | 2022.02.24 |
| [DB]DB Partitioning [DB 파티셔닝] (0) | 2022.02.15 |
| [AWS]RDS Mysql Replication 설정 (SpringBoot + JPA + Mysql) (0) | 2021.11.10 |
| [MYSQL]효율적인 트래픽 분산을 위한 Master/Slave 동적 라우팅 (0) | 2021.10.24 |