본문 바로가기
웹 개발/Back End

마이바티스 사용법

by L3m0n S0ju 2024. 9. 15.

 

 

 

 

쿼리에서 문자열 빈값 확인하기

 

<if test="keyword != null and keyword != ''">

이렇게 직접 null과 ""인지 확인하는 것 보다는 StringUtils를 사용하는게 더 안전하다고 합니다.

 

<if test="@org.apache.commons.lang3.StringUtils@isNotBlank(keyword)">

 

 

 

 

 


 

리스트 컬럼 가져오기

 

    public Response(Long addressBookFolderNo, String folderName, LocalDateTime createdAt, List<AddressBookGroupSearchDto.Response> groupList) {
        this.addressBookFolderNo = addressBookFolderNo;
        this.folderName = folderName;
        this.createdAt = createdAt;
        this.groupList = groupList;
    }
        
        
        
    <select id="getAddressBookFolderListWithGroup" parameterType="Long" resultMap="AddressBookFolderResultMap">
        SELECT
            ABF.ADDRESS_BOOK_FOLDER_NO,
            ABF.FOLDER_NAME,
            ABF.CREATED_AT,
            ABG.ADDRESS_BOOK_GROUP_NO,
            ABG.GROUP_NAME,
            ABG.CREATED_AT,
            ABG.UPDATED_AT
        FROM
            ADDRESS_BOOK_FOLDER ABF
        LEFT JOIN
            ADDRESS_BOOK_GROUP ABG ON ABF.ADDRESS_BOOK_FOLDER_NO = ABG.ADDRESS_BOOK_FOLDER_NO
        WHERE
            ABF.USER_NO = #{userNo}
        ORDER BY
            ABF.ADDRESS_BOOK_FOLDER_NO
    </select>

    <resultMap id="AddressBookFolderResultMap" type="AddressBookFolderSearchResponseDto">
        <result column="ADDRESS_BOOK_FOLDER_NO" property="addressBookFolderNo"/>
        <result column="FOLDER_NAME" property="folderName"/>
        <result column="CREATED_AT" property="createdAt"/>
        <collection property="groupList" javaType="List" ofType="AddressBookGroupSearchResponseDto">
            <result column="ADDRESS_BOOK_GROUP_NO" property="addressBookGroupNo"/>
            <result column="GROUP_NAME" property="groupName"/>
            <result column="CREATED_AT" property="createdAt"/>
            <result column="UPDATED_AT" property="updatedAt"/>
        </collection>
    </resultMap>

 

 

1:N 관계인 경우에는 resultMap을 이용하여 객체안에 리스트 컬럼을 넣을 수 있습니다. 다른 경우에는 실험해보지 않아서 잘 모르겠습니다.

 

사용법은 SELETE에 필요한 컬럼들을 나열하고 resultMap에서 각 컬럼을 원하는 위치에 세팅해주면 됩니다.

 

예를 들어 groupList라는 리스트 컬럼을 추가하고 싶을 때 collection의 property를 groupList로 설정해주고 하위에 groupList의 컬럼들을 설정해주면 됩니다.

 

 

 

 

 


변수 가져오기

 

xml 파일에서 만약 YesNo라는 Enum 타입을 가져오고 싶다면 아래와 같이 불러오면 됩니다.

 

   <select id="HELLO" parameterType="HELLO" resultType="HELLO">
        SELECT  *
        FROM    HELLO
        WHERE   ABCD = '${@com.daou.copbiz.common.define.common.YesNo@YES.getCode()}'
    </select>

 

 

 

 

@Getter
@RequiredArgsConstructor
public enum YesNo implements StonEnumMapperType {
    YES("Y", "YES"),
    NO("N", "NO");

    private final String code;
    private final String title;

    public boolean isYes() {
        return this == YES;
    }

    public boolean isNo() {
        return this == NO;
    }

    public static YesNo convert(boolean value) {
        return value ? YES : NO;
    }
}

 

 

 

 


객체 컬럼 가져오기

 

<select id="getOrderDetail" parameterType="Long" resultMap="OrderDetailMap">
    SELECT O.ORDER_ID, O.ORDER_DATE, C.CUSTOMER_ID, C.CUSTOMER_NAME, C.EMAIL
           , P.PRODUCT_ID, P.PRODUCT_NAME, P.PRICE
    FROM ORDERS O
    INNER JOIN CUSTOMER C ON O.CUSTOMER_ID = C.CUSTOMER_ID
    INNER JOIN PRODUCT P ON O.PRODUCT_ID = P.PRODUCT_ID
    WHERE O.ORDER_ID = #{orderId}
</select>

 

 

마이바티스에서 객체 컬럼을 가져올 때는 리스트 컬럼과 마찬가지로 resultMap을 사용합니다. 일단 위 쿼리처럼 SELECT에 사용할 컬럼 값들을 나열합니다.

 

<resultMap id="OrderDetailMap" type="OrderDetailDto">
    <id property="orderId" column="ORDER_ID"/>
    <result property="orderDate" column="ORDER_DATE"/>
    
    <association property="customer" javaType="CustomerDto">
        <result property="customerId" column="CUSTOMER_ID"/>
        <result property="customerName" column="CUSTOMER_NAME"/>
        <result property="email" column="EMAIL"/>
    </association>

    <association property="product" javaType="ProductDto">
        <result property="productId" column="PRODUCT_ID"/>
        <result property="productName" column="PRODUCT_NAME"/>
        <result property="price" column="PRICE"/>
    </association>
</resultMap>

 

 

위 resultMap 예시 보면 객체 컬럼은 association으로 가져오는 것을 볼 수 있습니다.

 

primary key를 가져올 때는 id 속성으로 가져오는데 MyBatis는 특정 엔티티를 식별할 때 이 id 값을 사용합니다. 이를 통해 MyBatis는 캐싱 전략 등을 효과적으로 적용할 수 있고, 중복된 객체를 생성하는 것을 방지한다고 합니다.

댓글