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 |