쿼리에서 문자열 빈값 확인하기
<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는 캐싱 전략 등을 효과적으로 적용할 수 있고, 중복된 객체를 생성하는 것을 방지한다고 합니다.
'웹 개발 > Back End' 카테고리의 다른 글
이벤트 리스너 사용법 (0) | 2024.09.17 |
---|---|
Java 헷갈리는 것들 모음 (0) | 2024.09.16 |
@Mapper 사용법(Dto -> 엔티티 매핑) (0) | 2024.09.09 |
스프링 시큐리티 개념 (0) | 2024.05.19 |
JPA : Java Persistence API - 자바 진영의 ORM 기술 표준 (0) | 2022.12.22 |
댓글