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