본문 바로가기
BackEnd/MyBatis

[MyBatis] list로 넘긴 데이터를 foreach 로 where in 구문에서 사용

by 성은2 2022. 9. 15.

IN 

  • 여러 값을 OR 관계로 묶어 나열하는 조건을 WHERE 절에 사용할 때 쓸 수 있는 키워드
  • 값은 콤마( , )로 구분하여 괄호 내에 묶으며, 이 값 중에서 하나 이상과 일치하면 조건에 맞는 것으로 평가됨

 

 

in 절은 조건이 여러개인 경우 ('조건1','조건2','조건3) 과 같은 문법으로 사용 가능하다.

WHERE report_id in ('1,'2','3')

 

이 문법을 java 소스에서 List<String> 타입으로 데이터를 넘겨주어서 사용 하고 싶다면? 아래 코드 복사시 사용 가능

where 조건 in

        <foreach item="item" collection="checkedIdList" open="(" close=")" separator=",">
         #{item}
        </foreach>

 

주의점 ! 조건 in 은   foreach 바깥에 써주세요

 

 

myBatis의 forEach로 반복을 돌리면서 separatort(구분자)에 쉼표(,)를 배치해주는 과정이 아래와 같다.

= 즉,  in('1','2','3') 을 만들어 주는 과정인데, 파라미터로 id List를 넘겨줘서 Mybatis로 동적 바인딩 하는 과정이다.

<update id="updateReportApproval" parameterType="Map">
    <choose>
    <when test="checkedIdList.size != 0">
    	UPDATE report
        SET report_approval = 1
        -- 조건 부분은 for each 구문 밖에
        WHERE report_id in
        <foreach item="item" collection="checkedIdList" open="(" close=")" separator=",">
        	#{item}
        </foreach>
    </when>
    </choose>
</update>

 

1. <foreach>로 반복을 돌린다.

2. collection : 반복구의 길이는 List 형태의 parameter인 checkedIdList의 길이 만큼이다.

(checkedIdList:  넘겨줄 때의 파라미터명)

3. open : 시작부분에 오는 문자열을 지정할 수 있다.

4. close : 끝부분에 오는 문자열을 지정할 수 있다.

5. separator : 구분자를 지정할 수 있다.