728x90
반응형

현재 유지보수 중인 시스템 내에
특정 상황에 in절 파라미터 갯수가 1000개 이상이 넘어가 에러가 발생했다.
아주 제한적인 환경이기 때문에 가장 공수가 덜 드는 방법을 고려하다가 iterate 태그를 사용해 처리했다.


<iterate>

  • iBATIS에서 반복적인 SQL 구문을 자동으로 생성하기 위해 사용되는 동적 SQL 태그(MyBatis에서는 <foreach>로 대체)
  • 주로 배열, 리스트, 컬렉션과 같은 반복 가능한 데이터 구조를 SQL 문에 바인딩할 때 사용
  • 파라미터 타입 Map의 key 또는 VO의 필드명 형태로 감싸서 넘겨야 함(단순히 List만 넘기면 <iterate>가 인식하지 못함)


Ex)

IN절에 리스트 바인딩

Map<String, Object> param = new HashMap<>();
param.put("userIdList", Arrays.asList("A001", "A002", "A003"));
<select id="getUserList" resultClass="User">
  SELECT *
  FROM USERS
  WHERE USER_ID IN
  <iterate property="userIdList" open="(" close=")" conjunction=",">
    #userIdList[]#
  </iterate>
</select>


실행 결과

SELECT *
FROM USERS
WHERE USER_ID IN ('A001','A002','A003')


<iterate>는 컬렉션(반복할 대상(배열, List 등)) 내 요소를 순회하면서 SQL 문을 반복적으로 생성

  • open/close: 반복 구문 앞뒤에 붙일 문자열 (예: (, ))
  • conjunction: 각 항목 사이에 붙일 구분자 (예: ,, OR, AND)
  • property: 각 항목의 필드명 (List일 경우 key명)


Ex)

다중 조건 OR 구문 생성

Map<String, Object> param = new HashMap<>();
param.put("names", Arrays.asList("홍길동", "이순신"));
<select id="findUserByNames" resultClass="User">
  SELECT *
  FROM USERS
  WHERE
  <iterate property="names" conjunction=" OR ">
    NAME = #names[]#
  </iterate>
</select>


실행 결과

SELECT *
FROM USERS
WHERE NAME = '홍길동' OR NAME = '이순신'



728x90
반응형

'ETC' 카테고리의 다른 글

notepad++ 꿀팁  (0) 2025.07.17
카카오 지도 API 사용법 - kakao is not defined  (0) 2025.05.10
Sublime text 꿀팁  (0) 2024.06.25
RSA 암호화 적용하기 - 키 생성 및 암•복호화  (0) 2024.06.03
Git&GitHub Desktop 설치  (0) 2023.07.14

+ Recent posts