728x90
목표: 조건이 있을 때만 WHERE절에 포함
예를 들어, name, email, status 중 입력된 값만으로 검색하고 싶다면 어떻게 해야 할까요?
1. DTO(검색 조건용 클래스) 만들기
public class UserSearchCondition {
private String name;
private String email;
private String status;
// getter, setter
}
2. Mapper 인터페이스 정의
List<User> searchUsers(UserSearchCondition cond);
3. XML Mapper에 동적 조건 구성
<select id="searchUsers" resultType="User" parameterType="UserSearchCondition">
SELECT * FROM users
<where>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="email != null and email != ''">
AND email = #{email}
</if>
<if test="status != null and status != ''">
AND status = #{status}
</if>
</where>
</select>
결과 예시
cond.name = "단비", 나머지 null
→ SQL 결과:
SELECT * FROM users WHERE name LIKE '%홍길동%'
cond.email = "test@example.com", 나머지 null
→ SQL 결과:
SELECT * FROM users WHERE email = 'test@example.com'
WHERE 대신 TRIM으로 직접 제어할 수도 있어요
<trim prefix="WHERE" prefixOverrides="AND |OR">
<if test="name != null"> AND name = #{name} </if>
<if test="email != null"> AND email = #{email} </if>
</trim>
prefixOverrides="AND |OR"는 조건문의 앞부분 AND, OR 제거
보너스: 페이징 처리까지 같이
<select id="searchUsersWithPaging" resultType="User" parameterType="map">
SELECT * FROM users
<where>
<if test="name != null"> AND name LIKE CONCAT('%', #{name}, '%') </if>
</where>
LIMIT #{offset}, #{pageSize}
</select>
파라미터를 Map으로 넘기면 조건 + 페이징값 같이 처리 가능
마무리 정리
태그 | 기능 | 사용 예 |
<where> | 자동 WHERE 처리 + AND/OR 정리 | 기본 조건 검색 |
<if> | 조건 분기 | if test="..." |
<trim> | 접두/접미 제어 | WHERE/SET 수동 구성 |
LIST
'Mybatis > 동적 SQL 작성' 카테고리의 다른 글
동적 정렬/페이징 구현 (0) | 2025.04.17 |
---|---|
if, choose, where, trim 태그 사용 (0) | 2025.04.17 |