<ResultMap>
<resultMap type="com.example.vo.Product" id="ProductResultMap">
<!-- ... -->
</resultMap>
<resultMap type="com.example.vo.Product" id="ProductResultMap">
<id column="product_no" property="no"/>
<result column="product_name" property="name"/>
</resultMap>
<id>
<result>
<association>
- 복잡한 타입의 연관 관계를 나타낸다.
(대부분 객체 타입)
- "has-one" 타입의 관계를 다루는 태그
class Product {
int no;
String name;
int price;
Company company; // 복잡한 타입의 연관관계
ProductCategory category; // 복잡한 타입의 연관관계
}
<association>
태그로 Product객체의 Company company 프로퍼티에 대입될 객체를* 한마디로, 매퍼에 있는 다른 SQL문을 실행해서 그 실행결과를 property에 담는다.
* 쿼리가 단순해지는 장점이 있는 반면, 쿼리가 3번 실행된다는 단점이 있다.
association />
태그로 실행시킨 다른 SQL 구문의 결과값을 저장할 프로퍼티 이름<association />, <collection />
1. <association /> : 복잡한 타입의 연관관계를 나타내며, "has-one"타입의 관계를 나타낸다.
2. <collection /> : 복잡한 타입의 콜렉션 연관관계를 나타내며, "has-many"타입의 관계를 나타낸다.
class Product {
int no;
String name;
int price;
Company company; - 복잡한 타입의 연관관계
ProductCategory category; - 복잡한 타입의 연관관계
List<Review> reviews; - 복잡한 타입의 콜렉션 연관관계
}
<ResultMap>
, <association>
사용 예시참고) select * 은 간단한 예시를 위해 사용했으나, 실제 코드에서는 지양해야 함
<!-- resultMap 정의 -->
<resultMap type="com.example.vo.Product" id="ProductResultMap">
<id column="product_no" property="no"/>
<result column="product_name" property="name"/>
<result column="product_description" property="description"/>
<result column="product_price" property="price"/>
<association property="company" column="company_no"
select="com.example.mapper.CompanyMapper.getCompanyByNo" />
<association property="category" column="product_category_no"
select="com.example.mapper.ProductCategoryMapper.getProductCategoryByNo" />
</resultMap>
<!-- resultMap 사용 -->
<select id="getProductByNo" parameterType="int" resultMap="ProductResultMap">
select
*
from
shop_products
where
product_no = #{value}
</select>
<ResultMap>
사용을 권장하지는 않음