본문 바로가기
Java & Kotlin/Spring Data

[MyBatis] 동적쿼리(동적 태그)

by heekng 2021. 5. 13.
반응형

[MyBatis] 동적쿼리(동적 태그)

MyBatis를 이용해서 같은 형태의 분류만 다른 쿼리를 사용해야 할 때 id만 다르게 쿼리를 여러개 작성해야 할 때가 있다.

이러할 때에는 동적 태그를 이용해서 하나의 쿼리문으로 여러 경우의 다른 쿼리를 전송할 수 있다.

MyBatis의 동적 태그에는 if, choose(when, otherwise), where, trim, foreach가 있다.


[ if ]

<if>는 <if test="[true 또는 false의 비교연산]"></if>의 형태로 작성한다.

 

검색 조건의 type항목이 Title일 때 예시

<if test="type == 'Title'">
	TITLE LIKE '%'||#{keyword}||'%'
<if>

[ choose ]

<choose>는 <when>과 <otherwise>와 함께 사용하며 <choose>태그 안에서 <when test="[true 또는 false의 비교연산]"> 그리고 <otherwise>의 형태로 작성한다.

 

검색 조건의 type항목이 Title일 때, Content일때, Writer일때와 그 외의 경우 예시

<choose>
	<when test="type='Title'">
    	TITLE LIKE '%'||#{keyword}||'%'
    </when>
	<when test="type='Content'">
    	CONTENT LIKE '%'||#{keyword}||'%'
    </when>
	<when test="type='Writer'">
    	WRITER LIKE '%'||#{keyword}||'%'
    </when>
    <otherwise>
    	TITLE LIKE '%'||#{keyword}||'%' OR CONTENT LIKE '%'||#{keyword}||'%' OR WRITER LIKE '%'||#{keyword}||'%'
    </otherwise>
</choose>

[ where ]

<where>은 <where>태그 속에서 <if>태그 등과 같이 조건을 두고, 조건절이 필요할 때에 WHERE을 붙여주는 태그다.

bno가 null이 아닐 경우 WHERE절을 붙이는 예시

SELECT * FROM TBL_TABLE
<WHERE>
	<if test="bno != null">
    	bno = #{bno}
    </if>
</WHERE>

[ trim ]

<trim>은 동적 태그를 이용하며 상황에 맞추어 코드를 추가하거나 삭제하는 태그이다.

상황에 따라 해당 태그 속에서 원하는 코드를 지울 수 있다.

<trim prefix="[trim태그 앞에 붙을 코드]" subfix="[trim태그 뒤에 붙을 코드]" prefixOverrides="[trim태그 속에 있는 코드 중 상황에 맞추어 제외하거나 존재하게 할 코드]"> 의 형태로 작성한다.

 

bno가 null이거나 아닐 때 AND를 붙일지 붙이지 않을 지 자동 선택하게 하는 예시

SELECT * FROM TBL_BOARD
<where>
	<if test="bno != null">]
    	BNO = #{bno}
    </if>
    <trim prefixOverrides="AND">
    	AND ROWNUm = 1
    </trim>
</where>

[ foreach ]

<foreach>는 List, 배열, map 등을 이용해서 루프를 처리한다.

<foreach item="value" index="key" collection="[List or 배열 or map]">의 형태로 작성한다.

 

반응형

'Java & Kotlin > Spring Data' 카테고리의 다른 글

[QueryDSL] 프로젝션  (0) 2022.05.14
[QueryDSL] QueryDSL 기본문법  (0) 2022.05.11
[QueryDSL] QueryDSL 시작하기  (0) 2022.05.10
[JPA] UniqueConstraint와 Embedded field  (0) 2022.05.07
[JPA]영속성 전이 CASCADE  (0) 2022.04.21
[JSP] MyBatis  (0) 2021.03.15