MyBatis

<if>, <foreach>, <trim>

99duuk 2024. 9. 9. 10:46

 


1. <if> 

<if> 태그 조건에 따라 SQL 구문의 일부를 포함시키거나 제외시킬 때 사용함.

<if test="조건식">
    SQL 구문
</if>
  • test 속성: 조건식을 지정함. 이 조건이 true로 평가되면 태그 내부의 SQL 구문이 포함됨.
<select id="selectActiveUsers" resultType="User">
    SELECT * FROM users
    WHERE 1=1
    <if test="status != null">
        AND status = #{status}
    </if>
    <if test="lastLoginDate != null">
        AND last_login_date > #{lastLoginDate}
    </if>
</select>

사용자 조회 시 status와 lastLoginDate 조건을 동적으로 적용

 

 

  • status가 null이 아니면 해당 status를 가진 사용자만 선택
  • lastLoginDate가 null이 아니면 해당 날짜 이후에 로그인한 사용자만 선택

 

 


2. <foreach> 

태그 컬렉션을 반복 처리할 때 사용함. IN 절이나 batch insert 등에 유용함.

<foreach item="항목" index="인덱스" collection="컬렉션"
         open="시작 문자열" separator="구분자" close="종료 문자열">
    #{항목}
</foreach>
  • item: 현재 반복 중인 요소를 참조하는 변수명
  • index: 현재 반복 중인 인덱스를 참조하는 변수명 (선택적)
  • collection: 반복할 컬렉션 지정
  • open, separator, close: 각각 반복 시작, 요소 간 구분, 반복 종료 시 사용할 문자열
<select id="selectPostIn" resultType="Post">
    SELECT * FROM post
    WHERE id IN
    <foreach item="item" index="index" collection="list"
             open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

여러 개의 post id를 입력받아 해당하는 post들을 조회

 

 

  • list 컬렉션의 각 요소를 순회함
  • 각 요소는 괄호로 둘러싸이고 쉼표로 구분됨
  • 결과적으로 "WHERE id IN (id1, id2, id3, ...)" 형태의 SQL 생성

 


3. <trim> 

태그 SQL 문의 앞뒤에 특정 문자열을 추가하거나 제거할 때 사용함.

<trim prefix="시작문자열" prefixOverrides="제거할 시작 문자열"
      suffix="종료문자열" suffixOverrides="제거할 종료 문자열">
    SQL 구문
</trim>
  • prefix: 앞에 추가할 문자열
  • prefixOverrides: 앞에서 제거할 문자열
  • suffix: 뒤에 추가할 문자열
  • suffixOverrides: 뒤에서 제거할 문자열

 

<select id="selectEmployeesByLevel" resultType="Employee">
    SELECT * FROM employees
    WHERE 1=1
    <choose>
        <when test="selType eq 'SUPERIOR'">
            AND employee_level > #{level}
        </when>
        <when test="selType eq 'SUBORDINATE'">
            AND employee_level < #{level}
        </when>
        <otherwise>
            AND employee_level = #{level}
        </otherwise>
    </choose>
</select>

Author 테이블의 레코드를 동적으로 업데이트

 

 

  • SET 키워드를 자동으로 추가
  • 각 필드가 null이 아닐 때만 해당 필드를 업데이트
  • 마지막 컬럼 뒤의 불필요한 쉼표를 자동으로 제거

 

 

'MyBatis' 카테고리의 다른 글

계층 쿼리 (중첩 SELECT_mysql, CTE_mysql, CONNECT BY_oracle)  (0) 2024.09.09
@변수명 :=  (0) 2024.09.09
<sql>, <include>, <selectKey>  (0) 2024.09.09
<set>, <where>  (0) 2024.09.09
<choose>, <when> , <bind>  (0) 2024.09.09