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>