코딩

[Mybatis] 동적 SQL 정리

2025. 6. 27. 16:14

동적 SQL

입력값에 따라 SQL문장을 동적으로 생성하는 기능, 다양한 태그들을 제공

 

 

1. <if>

조건에 따라 SQL 구문을 포함 시킴

<if test='userName != null and userName !=""'>
    AND USER_NAME = #{userName}
</if>

 

📌 장단점

장점 : 조건부 필터링을 깔끔하게 처리

단점 : 조건이  많을수록 XML 가독성이 낮아짐

 

2. <choose>, <when>, <otherwise>

자바의 switch 문 처럼 사용

<choose>
    <when test="sort == 'userName'">ORDER BY USER_NAME <if test="dir == 'desc'">DESC</if></when>
    <otherwise>ORDER BY CREATE_DATE <if test="dir == 'desc'">DESC</if></otherwise>
</choose>

 

📌 장단점

장점 : switch처럼 명확한 분기 처리 가능

단점 : if 와 마찬가지로 조건이 많을수록 XML 가독성이 낮아짐

 

3. <where>

WHERE 절을 자동으로 붙여주며, 첫 번째 조건절 앞의 AND 나 OR도 자동으로 제거해줌

<where>
    <if test='userName != null and userName != ""'>AND USER_NAME = #{userName}</if>
    <if test='userId != null and userId != ""'>AND USER_ID = #{userId}</if>
</where>

 

📌 장단점

장점 : 자동으로 WHERE 및 앞 AND 제거하여 오류를 방지

단점 : 조건이 아예 없을 경우 예외처리를 안하면 전체검색 되는 문제 (1=1)

 

4. <set>

UPDATE 쿼리의 SET 구문에 사용, 불필요한 (,) 를 제거

<update id="updateUser" parameterType="User">
UPDATE user
    <set>
       <if test='userName != null and userName != ""'>USER_NAME = #{userName}</if>
    </set>
WHERE USER_ID = #{userId}
</update>

 

📌 장단점

장점 : 자동으로 마지막 쉼표 제거하여 오류 방지

단점 : if 와 마찬가지로 조건이 많을수록 XML 가독성이 낮아짐, 태그안에 조건이 없을경우 에러발생

 

5. <trim>

접두사, 접미사 추가/삭제 및 불필요한 구문 제거

prefix : 실행될 쿼리의 가장 앞에 문자를 추가

prefixOverrides : 실행될 쿼리의 가장 앞에 해당하는 문자가 있는 경우 제거

suffix : 실행될 쿼리의 가장 뒤에 문자를 추가

suffixOverrides : 실행될 쿼리의 가장 뒤에 해당하는 문자가 있는 경우 제거

<!-- WHERE 절 -->
<trim prefix="WHERE" prefixOverrides="AND|OR">
    <if test='userName != null and userName != ""'>
        AND USER_NAME = #{userName}
    </if>
    <if test='userId != null and userId != ""'>
        AND USER_ID = #{userId}
    </if>
</trim>

<!-- SET 절 -->
<trim prefix="SET" prefixOverrides="," suffixOverrides=",">
    <if test='userName != null userName != ""'>
        USER_NAME = #{userName},
    </if>
    <if test='userId != null userId != ""'>
        USER_ID = #{userId},
    </if>
</trim>

 

📌 장단점

장점 : 유연한 SQL 작성 가능

단점 : if 와 마찬가지로 조건이 많을수록 XML 가독성이 낮아짐

 

6. <foreach>

반복 처리를 위한 태그

collection : 컬렉션 파라미터(Map, List, Set, 배열 등 반복가능한 객체)

item : 현재 반복되는 값을 저장할 변수

index : 현재 반복되는 인덱스 값을 저장할 변수

open : 쿼리가 실행될 때 앞에 추가될 접두사

close : 쿼리가 실행될 때 끝에 추가될 접미사

separator : 컬렉션이 반복될 때 추가될 구분자

<select id="selectUser" parameterType="User" resultType="User">
    SELECT *
    FROM USER
    WHERE USER_ID IN
    <foreach collection="userList" item="item" open="(" separator="," close=")">
        #{item.userId}
    </foreach>
</select>

 

📌 장단점

장점 : 반복처리, 코드가 간결해짐

단점 : if 와 마찬가지로 조건이 많을수록 XML 가독성이 낮아짐

 

'코딩' 카테고리의 다른 글

[Crownix Report] 사용 방법 및 함수 정리  (0) 2025.07.08
[Mybatis] 보조기능 태그 정리  (1) 2025.06.30
[Mybatis] Collection, Association 정리  (0) 2025.06.15
[JAVA] 추가 공부 정리  (1) 2025.03.22
[Python] 행렬 미분 정리  (0) 2025.02.19