[리팩토링] Mybatis 에서 XML 사용하지 않는 방법 (동적쿼리는 불가능..)

소개

  • Mybatis 는 XML 매핑으로 진행하는 게 일반적이긴하다.
  • 하지만 어노테이션만으로도 XML 없이 쿼리를 정의할 수 있다.

    다만 , 동적쿼리는.. xml 파일을 별도로 정의해주긴해야한다.

어노테이션 사용

@Mapper
@Repository
public interface CartMapper {
    // ...
    @Results(value = {
        // ...
    })
    @Select("SELECT ...")
    Cart selectCartByUserId(@Param("userId") String userId);
}
  1. 쿼리 정의
    • @Select 어노테이션으로 SQL 쿼리를 정의하고, @Param 으로 쿼리 파라미터를 정의함
  1. 결과 매핑
    • @Results@Result 어노테이션을 사용하여 쿼리 결과를 도메인 객체에 매핑합니다.
  1. 관계 매핑

    @One 어노테이션을 사용하여 1:1 관계를 매핑하고, javaType 속성을 사용하여 반환 타입을 지정합니다.

    @Results(value = {
            @Result(id = true, property = "id", column = "ID"),
            @Result(property = "userId", column = "USER_ID"),
            @Result(property = "productId", column = "PRODUCT_ID"),
            @Result(property = "quantity", column = "QUANTITY"),
            @Result(property = "createdDate", column = "CREATED_DATE"),
            @Result(property = "updatedDate", column = "UPDATED_DATE"),
            @Result(property = "product", column = "PRODUCT_ID", javaType = Product.class, one = @One(select = "com.psj.itembrowser.product.mapper.ProductMapper.selectProductById" ,fetchType = FetchType.LAZY))
        })
@Mapper
@Repository
public interface ProductMapper {
    @Results(id = "productResutMap", value = {
        @Result(id = true, property = "id", column = "ID"),
        @Result(property = "name", column = "NAME"),
        @Result(property = "category", column = "CATEGORY"),
        @Result(property = "detail", column = "DETAIL"),
        @Result(property = "status", column = "STATUS"),
        @Result(property = "sellerId", column = "SELLER_ID"),
        @Result(property = "sellStartDatetime", column = "SELL_START_DATETIME"),
        @Result(property = "sellEndDatetime", column = "SELL_END_DATETIME"),
        @Result(property = "displayName", column = "DISPLAY_NAME"),
        @Result(property = "unitPrice", column = "UNIT_PRICE"),
        @Result(property = "brand", column = "BRAND"),
        @Result(property = "deliveryFeeType", column = "DELIVERY_FEE_TYPE"),
        @Result(property = "deliveryMethod", column = "DELIVERY_METHOD"),
        @Result(property = "deliveryDefaultFee", column = "DELIVERY_DEFAULT_FEE"),
        @Result(property = "freeShipOverAmount", column = "FREE_SHIP_OVER_AMOUNT"),
        @Result(property = "returnCenterCode", column = "RETURN_CENTER_CODE"),
        @Result(property = "createdDate", column = "CREATED_DATE"),
        @Result(property = "updatedDate", column = "UPDATED_DATE")
    })
    @Select("SELECT ID, NAME, CATEGORY, DETAIL, STATUS, SELLER_ID, SELL_START_DATETIME, SELL_END_DATETIME, " +
        "DISPLAY_NAME, UNIT_PRICE, BRAND, DELIVERY_FEE_TYPE, DELIVERY_METHOD, DELIVERY_DEFAULT_FEE, FREE_SHIP_OVER_AMOUNT, RETURN_CENTER_CODE, CREATED_DATE, UPDATED_DATE " +
        "FROM PRODUCT  " +
        "WHERE ID = #{productId} " +
        "LIMIT 1")
    Product selectProductById(@Param("productId") Long productId);


Uploaded by N2T