코딩

[Mybatis] Collection, Association 정리

2025. 6. 15. 02:24

📌 용도

복잡한 결과를 매핑 할때 사용하는 XML 태그, 중첩 객체나 List형태로 매핑할때 사용

예시) 객체 정보

class User {
    int id;
    String name;
    String country;
    Address address;
    List<Order> orders;
}

class Address {
    String mainAddress;
    String subAddress;
}

class Order {
    int orderId;
    String orderItem;
}

1. <association>

1:1 관계 – 결과를 하나의 객체 필드에 매핑할 때 사용

 

1. 사용자 정보 조회 (단일 컬럼일 경우)

<resultMap id="userResultMap" type="User">
    <association property="address" javaType="Address" select="selectAddressByUserId" column="id"/>
</resultMap>
<!-- 사용자 조회 쿼리 -->
<select id="selectUser" parameterType="User" resultMap="userResultMap">
    SELECT
    	ID,
        NAME
    FROM USER
    WHERE ID = #{id}
</select>
<!-- 사용자 주소 조회 쿼리 -->
<select id="selectAddressByUserId" resultType="Address">
    SELECT 
    	MAIN_ADDRESS,
        SUB_ADDRESS
    FROM ADDRESS 
    WHERE ID = #{id}
</select>

 

2. 사용자 정보 조회 (다중 컬럼일 경우)

<resultMap id="userResultMap" type="User">
    <association property="address" javaType="Address" select="selectAddressByUserId" column="{id=id, country=country}"/>
</resultMap>
<!-- 사용자 조회 쿼리 -->
<select id="selectUser" parameterType="User" resultMap="userResultMap">
    SELECT
    	ID,
        NAME,
        COUNTRY
    FROM USER
    WHERE ID = #{id}
</select>
<!-- 사용자 주소 조회 쿼리 -->
<select id="selectAddressByUserId" parameterType="User" resultType="Address">
    SELECT 
    	MAIN_ADDRESS,
        SUB_ADDRESS
    FROM ADDRESS 
    WHERE ID = #{id} 
    	AND COUNTRY = #{country}
</select>

 

속성 정리

  1. property : User 클래스에 있는 필드명으로 결과가 매핑될 객체의 프로퍼티
  2. javaType : 매핑할 필드의 객체 타입 (property의 타입)
  3. select : 별도로 호출할 select 쿼리 id
  4. column : select 쿼리에 넘길 파라미터 (사용자 조회 쿼리에서 나온 결과중 id를 selectAddressByUserId에 넘김)

 

2. <collection>

1:N 관계 – 결과를 리스트(Collection) 필드에 매핑할 때 사용

 

1. 사용자 주문내역 조회 (단일 컬럼일 경우)

<resultMap id="userResultMap" type="User">
    <collection property="orders" ofType="Order" select="selectOrdersByUserId" column="id"/>
</resultMap>
<!-- 사용자 조회 쿼리 -->
<select id="selectUser" parameterType="User" resultMap="userResultMap">
    SELECT
    	ID,
        NAME
    FROM USER
    WHERE ID = #{id}
</select>
<!-- 사용자 주문내역 조회 쿼리 -->
<select id="selectOrdersByUserId" resultType="Order">
    SELECT 
    	ORDER_ID,
        ORDER_ITEM
    FROM ORDER 
    WHERE ID = #{id} 
</select>

 

2. 사용자 주문내역 조회 (다중 컬럼일 경우)

<resultMap id="userResultMap" type="User">
    <collection property="orders" ofType="Order" select="selectOrdersByUserId" column="{id=id, country=country}"/>
</resultMap>
<!-- 사용자 조회 쿼리 -->
<select id="selectUser" parameterType="User" resultMap="userResultMap">
    SELECT
    	ID,
        NAME,
        COUNTRY
    FROM USER
    WHERE ID = #{id}
</select>
<!-- 사용자 주문내역 조회 쿼리 -->
<select id="selectOrdersByUserId" parameterType="User" resultType="Order">
    SELECT 
    	ORDER_ID,
        ORDER_ITEM
    FROM ORDER 
    WHERE ID = #{id}
    	AND COUNTRY = #{country}
</select>

 

속성 정리

  1. property : User 클래스에 있는 필드명으로 결과가 매핑될 객체의 프로퍼티
  2. ofType : 컬렉션 내부에 들어가는 객체의 타입 -> List<Order> 에서 Order
  3. select : 별도로 호출할 select 쿼리 id
  4. column : select 쿼리에 넘길 파라미터 (사용자 조회 쿼리에서 나온 결과중 id를 selectOrdersByUserId에 넘김)
  5. javaType : 매핑할 필드의 객체 타입 (property의 타입, collection 에서는 생략가능

 

'코딩' 카테고리의 다른 글

[Mybatis] 보조기능 태그 정리  (1) 2025.06.30
[Mybatis] 동적 SQL 정리  (0) 2025.06.27
[JAVA] 추가 공부 정리  (1) 2025.03.22
[Python] 행렬 미분 정리  (0) 2025.02.19
[Python] 선형대수 정리  (0) 2025.02.06