Spring
스프링 - Mybatis 동적 태그
마루설아
2025. 6. 14. 16:10
<if>
속성과 함께 조건이 true가 되었을 때 태그 내에 있는 SQL을 사용하기 위한 태그이다.
<if test="type == 'T'.toString()">
(title like '%'||#{keyword}||'%')
</if>
<choose>
Java의 if~else과 유사하며, 여러 조건 중 하나만 동작한다.
otherwise는 모든 조건에 충족되지 않을 때 실행된다.
<choose>
<when test="type == 'T'.toString()">
(title like '%'||#{keyword}||'%')
</when>
<when test="type == 'C'.toString()">
(content like '%'||#{keyword}||'%')
</when>
<when test="type == 'W'.toString()">
(writer like '%'||#{keyword}||'%')
</when>
<otherwise>
<!-- else.. -->
</otherwise>
</choose>
<trim>, <where>
단독으로 사용할 수 없으며 동적 쿼리를 생성할 때 사용할 수 있다.
<if>, <choose>등을 내포하여 사용하고 조건에 따라 AND, OR, WHERE등을 추가 또는 생략하는 역할이다.
<where>의 경우 bno가 null이면 WHERE이 붙지 않는다.
select * from tbl_board
<where>
<if test="bno != null">
bno = #{bno}
</if>
</where>
<trim>의 경우 bno가 null이 아니면 and를 붙이고, null이면 붙이지 않는다.
select * from tbl_board
<where>
<if test="bno != null">
bno = #{bno}
</if>
<trim prefix="and">
rownum = 1
</trim>
</where>
<foreach>
typeArr Map을 파라미터로 전달하여 index, item을 각각 키, 값으로 받아서 처리할 수 있다.
<sql>, <include>
SQL 일부를 별도로 보관하고 필요할 때 include하여 사용할 수 있다.
현재 구현중인 코드 총 정리 (검색 기능 구현)
<!-- 검색 기능 구현을 위한 쿼리 작성 -->
<sql id="criteria">
<trim prefix="(" suffix=") AND " prefixOverrides="OR">
<foreach item='type' collection="typeArr">
<trim prefix="OR">
<choose>
<when test="type == 'T'.toString()">
title like '%'||#{keyword}||'%'
</when>
<when test="type == 'C'.toString()">
content like '%'||#{keyword}||'%'
</when>
<when test="type == 'W'.toString()">
writer like '%'||#{keyword}||'%'
</when>
</choose>
</trim>
</foreach>
</trim>
</sql>
<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO">
<![CDATA[
SELECT BNO, TITLE, CONTENT, WRITER, REGDATE, UPDATEDATE
FROM
(
SELECT /*+INDEX_DESC(TBL_BOARD PK_BOARD) */
ROWNUM RN, BNO, TITLE, CONTENT, WRITER, REGDATE, UPDATEDATE
FROM TBL_BOARD
WHERE
]]>
<!-- 위에서 작성한 criteria SQL 사용하기 -->
<include refid="criteria"></include>
<![CDATA[
ROWNUM <= #{pageNum} * #{amount}
)
WHERE RN > (#{pageNum} - 1) * #{amount}
]]>
</select>
<select id="getTotalCount" resultType="int">
SELECT COUNT(*) FROM TBL_BOARD WHERE
<!-- 위에서 작성한 criteria SQL 사용하기 -->
<include refid="criteria"></include>
BNO > 0
</select>