[java] MyBatis에서 동적 SQL 작성하기

MyBatis는 자바 ORM(Object Relational Mapping) 프레임워크로, 데이터베이스와의 상호작용을 쉽게 할 수 있도록 도와줍니다. MyBatis를 사용할 때, 동적 SQL 작성은 매우 유용합니다. 동적 SQL은 조건에 따라 쿼리문을 유연하게 작성할 수 있게 해줍니다.

IF 조건문

IF 조건문은 제일 일반적으로 사용되는 동적 SQL 작성 방법입니다. 이를 사용하면 조건에 따라서 SQL 쿼리문에서 조건절을 추가하거나 생략할 수 있습니다.

<select id="getUserList" resultType="User">
  SELECT * FROM user
  WHERE 1=1
  <if test="name != null">
    AND name = #{name}
  </if>
  <if test="age != null">
    AND age = #{age}
  </if>
</select>

위의 코드에서, nameage가 null이 아닌 경우에만 조건절을 추가합니다. 만약 name이 null이면 AND name = #{name}은 생략되고, age가 null이면 AND age = #{age}는 생략됩니다.

CHOOSE 조건문

CHOOSE 조건문은 여러 개의 조건 중에서 하나를 선택할 수 있도록 도와줍니다. 주로 연속적인 if-else 문을 대체하는데 사용됩니다.

<select id="getUserList" resultType="User">
  SELECT * FROM user
  WHERE 1=1
  <choose>
    <when test="name != null">
      AND name = #{name}
    </when>
    <when test="age != null">
      AND age = #{age}
    </when>
    <otherwise>
      AND isActive = true
    </otherwise>
  </choose>
</select>

위의 코드에서, name이 null이 아니라면 AND name = #{name}이 실행되고, age가 null이 아니라면 AND age = #{age}이 실행됩니다. 그 외의 경우에는 AND isActive = true이 실행됩니다.

FOREACH 반복문

FOREACH 반복문은 주로 리스트나 배열과 같은 자료구조를 순회하면서 동적인 쿼리문을 작성할 때 사용합니다.

<foreach collection="userList" item="user" separator=",">
  INSERT INTO user (name, age) VALUES (#{user.name}, #{user.age})
</foreach>

위의 코드에서, userList는 User 객체를 담고 있는 리스트입니다. FOREACH 반복문을 사용하여 리스트의 요소를 하나씩 가져와서 쿼리문을 실행합니다.

마치며

MyBatis에서 동적 SQL 작성은 조건에 따라 유연하게 쿼리를 작성할 수 있는 좋은 기능입니다. IF 조건문, CHOOSE 조건문 및 FOREACH 반복문을 사용하여 복잡한 쿼리문을 작성할 수 있습니다.

더 많은 MyBatis의 기능과 사용법은 MyBatis 공식 문서를 참조하시기 바랍니다.