본문 바로가기
Mybatis/동적 SQL 작성

동적 조건 검색 처리

by DEVLIB 2025. 4. 17.
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