[java] MyBatis 동적 쿼리 생성

많은 경우에 데이터베이스 쿼리는 동적으로 생성되어야 합니다. 예를 들어 사용자 입력이나 다른 조건에 따라 WHERE 절이 동적으로 변경되어야 하는 경우 등이 그 예입니다. MyBatis를 사용하면 동적 쿼리를 쉽게 생성할 수 있습니다.

1. 동적 SQL 사용하기

MyBatis에서는 <if>, <choose>, <when>, <otherwise>와 같은 XML 요소를 사용하여 동적 SQL을 생성할 수 있습니다.

예를 들어, WHERE 절을 동적으로 생성하는 SQL 매핑은 다음과 같이 작성될 수 있습니다.

<select id="selectUsers" parameterType="map" resultType="User">
  SELECT * FROM users
  <where>
    <if test="name != null">
        AND name = #{name}
    </if>
    <if test="id != null">
        AND id = #{id}
    </if>
  </where>
</select>

위의 예제에서 nameid 파라미터에 따라 WHERE 절이 동적으로 추가됩니다.

2. 동적 쿼리 빌더 사용하기

MyBatis 3.5.0 버전부터는 SqlBuilder 인터페이스를 이용하여 프로그래밍적으로 동적 쿼리를 구성할 수 있습니다. 이를 활용하면 XML을 사용하지 않고도 동적 SQL을 생성할 수 있습니다.

@SelectProvider(type = UserSqlBuilder.class, method = "buildSelectQuery")
User selectUsers(Map<String, Object> params);
public class UserSqlBuilder {
  public static String buildSelectQuery(Map<String, Object> params) {
    SQL sql = new SQL().SELECT("*").FROM("users");
    if (params.get("name") != null) {
        sql.WHERE("name = #{name}");
    }
    if (params.get("id") != null) {
        sql.WHERE("id = #{id}");
    }
    return sql.toString();
  }
}

3. 결과

동적 쿼리 생성에는 XML을 사용하는 방법과 동적 쿼리 빌더를 사용하는 방법이 있습니다. 어떤 방법을 선택하든 MyBatis를 사용하여 동적 쿼리를 쉽게 생성할 수 있습니다.

이 밖에도 MyBatis에서 동적 쿼리 생성에 대한 상세 내용은 MyBatis 공식 문서를 참고할 수 있습니다.