동적 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 |