[Mybatis]_MyBatis의 동적 태그 정리

2022. 10. 19. 17:56[DB]/Mybatis

728x90
반응형

개요

 

Mybatis 나 IBatis 를 사용하여 쿼리문을 작성할 때 특정 조건, 혹은 파라미터의 존재 유무에 따라 ex)_ 페이징 처리

비슷한 쿼리를 여러개 작성해야 합니다.

 

이렇게 비슷한 쿼리를 여러개 생성하는 것 보다. MyBatis 에서 제공하는 동적쿼리를 사용하면 한 쿼리 안에 여러가지의 경우의 수를 가진 쿼리를 작성 할 수 있습니다.

 

- MyBatis의 동적 태그에는 if, choose, where, trim, foreach가 있습니다.


1. IF 문 : 단일 조건문

기본 문법 ]

<if test="parameter 비교문">
   //실행할 쿼리
</if>

 

예시]

<if test='userName != null and userName != "" '>
AND        user_Name = #{userName}
</if>
  • 전달 파라미터 : userName
  • 비교문 : userName 이 null이 아니거나 "" (공백) 이 아닐경우 쿼리 실행
  • 쿼리 내용 : 이전에 쿼리와 붙이기 위해 AND 이후 userName을 파라미터의 userName과 비교

 

만약 null 혹은 공백이라면 해당 쿼리 실행하지 않고 진행

 

 

2. Choose (when,otherwise) : 다중 조건문

기본문법]

<choose>
   <when test="parameter 비교문">
      //실행할 쿼리
   </when>
   <otherwise>
      //실행할 쿼리
   </otherwise>
</choose>

예시

<choose>
   <when test="param1 != null and !param1.equals('')">
      AND user_type = #{param1}
   </when>
   <otherwise>
      AND user_type = 'all'
   </otherwise>
</choose>
  • choose 문 사이에 whenotherwise 를 작성합니다 (otherwise 는 생략 가능)
  • when 문은 여러개 작성 가능하며, 조건문이 true 일경우 내무의 쿼리를 실행합니다.
  • 만약 when 문에 작성된 값중 true 가 없다면 otherwise 문 내부의 쿼리가 실행됩니다.

3.where & set

조건 : Mybatis version 3.2.3 이상

<select id="testSelect">
SELECT * FROM table
<where>
// 쿼리
</where>
</select>

단독으로 사용하지 않고 보통 다른 태그들을 내포하여 사용하는 경우가 많습니다.

예시

<select id="testSelect">

	SELECT * FROM TEST_TABLE
    <where>
    	<if test='user_id != null and user_id != "" '>
    		user_id = #{user_id}
    	</if>
        <if test='user_pw != null and user_pw != "" '>
        	user_pw = #{user_pw}
        </if>
    </where>


</select>
  • where 사이에 if 문 둘다 조건을 충족하지 못할 경우
  • select * from TEST_TABLE 만 실행되고

 

  • 만일 조건을 충족한다면 where절을 자동으로 추가해 줍니다.
  • 만약 2가지 조건이 충족되어 sql문이 실행된다면 자동으로 사이에 AND를 넣어주는 역할을 합니다.

 

set 은 update 문에서  where 와 동일한 역할을 합니다.

 

4.trim

<trim prefix="" prefixOverrides="">
	<if>
    	//sql
    </if>
</trim>

 

  • where 와 비슷하게 다른 서브쿼리를 도와주는 역활을 하며

 

  • prefix 의 경우 sql 구문 앞에 추가적인 구문을 넣어줍니다.
  • suffix의 경우 sql 구문 뒤에 추가적인 구문을 넣어줍니다.
  • prefixOverrides 의 경우 sql 구문 앞에 해당 문자가 있으면 자동으로 지워줍니다.
  • suffixOverrides 의 경우 sql 구문 뒤에 해당 문자가 있으면 자동으로 지워줍니다.

예시

<trim prefix="WHERE" prefixOverrides="AND|OR">
   <if test="searchType=='content' and keyword != null and keyword != '' ">
      AND CONTENT like CONCAT('%', #{keyword}, '%')
   </if>
   <if test="searchType=='register' and keyword != null and keyword != '' ">
      AND REGISTER like CONCAT('%', #{keyword}, '%')
   </if>  
</trim>

 

  • trim 내부의 조건절이 true 인경우 자동으로 where 절을 붙여줍니다.
  • 만약 앞에 AND 혹은 OR 가 있을경우 자동으로 지워줍니다.

 

5. foreach

내용이 많아 다음 포스트 참고

https://yn971106.tistory.com/151

 

[MyBatis]_동적 쿼리_foreach문_feat(List<Map>데이터)

사용환경] DB : oracle FrameWork : Spring, mybatis 목표] 클라이언트에서 한가지 key 와 value 로 이루어진 json 데이터 뿐 만 아니라 파라미터에 List 데이터가 담긴 경우 여러 API 를 발송하는 것이 아니라 한..

yn971106.tistory.com

6. sql & include

공통적으로 사용하는 쿼리일 경우 따로 작성하여 재사용 할 수 있습니다.

<sql id="findUser">
	<choose>
    	<when test='user_id != null and user_id != "" '>
        	and user_id = #{user_nm}
        </when>
    </choose>
</sql>

id 를 부여하고 공통적으로 사용할 쿼리를 sql 태그 안에 작성합니다.

<include refid="findUser" />

 위와같은 include 태그를 통해 해당 아이디를 불러옴으로써 해당 위치에 sql문을 대체할 수 있습니다.

 


대표적으로 많이 사용하는 MyBatis 동적쿼리를 알아보았습니다.

 

다음에는 IBatis 에서 자주 사용하는 동적쿼리를 알아보겠습니다.

 

감사합니다.

 

728x90
반응형

'[DB] > Mybatis' 카테고리의 다른 글

[MyBatis]_동적 쿼리_foreach문_feat(List<Map>데이터)  (0) 2022.10.19