본문 바로가기
웹개발지식쌓기

[back] Mybatis foreach 구문 사용하기

by developer_j 2021. 5. 16.
728x90
반응형

주제 : mybatis의 foreach 구문 - collection 속성명에 무어슬 써야하는가

array ? list ? 아니면 내가 선언한 배열변수명? 

일단 나는 특정 회원의 id 값을 가지고, 여러 구매물품을 구매한 이력이 존재하는지 count 값을 가져와야하는 상황이 생겼다.

이전 프로젝트에서 특정 여행지 일련번호로 등록된 관련 여행 상품들을 가져오거나, 동일한 형식의 row를 INSERT 해야 할 때 mybatis 의 foreach 구문을 이용해서 처리해 본 적이 있었다.

<!-- 예1 ) 특정 여행지 번호에 관련상품으로 등록한 여행상품목록 가져오기 -->
<select id="getRelatedGoodsList" resultMap="GoodsVO">
	SELECT * FROM TB_GOODS WHERE DESTINATION_SEQ IN 
	<foreach collection="array" item="item" open="(" close=")" separator=",">
		#{item}
	</foreach>
</select>

<!-- 예2 ) LIST 데이터 일괄등록 -->
<insert id="insertRequestData" parameterType="java.util.List" > 
	<foreach item="item" index="index" collection="list" separator=" " open="INSERT ALL " close="SELECT * FROM DUAL">
    	INTO TB_REQUEST
            (
            	field1,
                field2,
                ...
            )
            	VALUES
            (
            	#{param1},
                #{param2},
                ...
            )
    </foreach>
</insert>

당시에는 collection 속성의 값으로 "array"나 "list"를 입력했었는데, 이 때만 해도 입력변수의 객체형태를 입력해야하는 걸로 알고 있었다. (맞긴맞음)

그러나 위의 예시들은 필요한 데이터를 직접 넘기는 형태였고, (예를 들면 1번 예시에서처럼 관련 상품 일련번호들만을 String[]로 넘기는 것) 내가 이번에 시도하려고 했던 것은 기존 VO 객체에 string[] 변수를 추가하여 동시에 변수값을 담아 보내고 싶었다.

1. 배열형 변수 추가하기

2. 소스 / 쿼리 작성

< JAVA 소스>

 

< 쿼리 > 

 

3. 시도했더니 오류뿜음

작동하지 않는 쿼리

array란 이름의 getter가 없다는 건데, 그렇다면 배열형태의 변수라서 array라고 적는게 아니었나보다. 해당 커맨드 객체 안의 배열변수명을 적어보니까 잘 됐당

 

4. 수정하고 다시 시도. 작동함

작동하는 쿼리

 

결론

- 배열 변수를 직접 넘길경우 collection="array"

- 배열 변수를 커맨드 객체에 포함시켜서 넘길경우 collection="배열변수명"

화질왜이럼

 

 

++ 관련 주제 다른 분 게시글 !

https://wook-dragon.tistory.com/8

 

[MyBatis] 동적쿼리 foreach문

예를들어, DB에 insert를 10개 한다하면 나는 serviceimpl에서 for문을 10번 돌려가면서 insert를 했었다. 그러다보니 코드도 지저분해지는 것이 보이고 하여 MyBatis foreach를 접하게되었다. MyBatis foreach문..

wook-dragon.tistory.com

 

728x90
반응형