SQL

[MyBatis/SQL]MyBatis 동적쿼리 if문 | MyBatis 동적쿼리 이용하기 | MyBatis SQL

엘라 ELLA 2023. 1. 26. 23:00
728x90
반응형

 

게시글이 도움이 되었다면

[로그인]이 필요 없는 ❤ 클릭과

게시글의 광고를 클릭 해 주세요:)

 

 

MyBatis 동적쿼리 SQL문이란?

MyBatis에서 상황에 따라서 분기처리를 하는 유동적으로 동작하는 SQL 쿼리문을 뜻한다.

 


 

MyBatis 동적쿼리 SQL문 기능 등장 배경

 

아래의 세가지 쿼리문을 보면, 조건이 하나씩 추가 됨에 따라 각각 따로의 쿼리문을 작성하였다.

 

세개의 쿼리문 모두 SELECT * FROM member이라는 구절이 같으므로 이런 겹치는 코드를 계속 반복되고 있다. 이런 상황을 피하고, 좀 더 유용하게 쿼리문을 이용하기 위해 등장한 것이 동적쿼리 이다.

 

즉, 아래의 세 쿼리문을 한 덩어리로 표현가능하게 하는것이다.

 

SELECT * FROM member;
SELECT * FROM member
WHERE id = '1';
SELECT * FROM member
WHERE id = '1'
AND name = '김';

 

 


 

MyBatis 동적쿼리 SQL문의 특징

 

  • 주로 SQL문의 조건절에서 사용한다.
  • 조건절(WHERE절)에 조건을 동적으로 추가한다.
  • JSTL과 XML기반으로 동적 SQL문을 작성한다.

 


 

MyBatis 동적쿼리 SQL문의 구성요소

 

  • if
  • choose(when, otherwirs)
  • trim(where, set)
  • foreach

 


 

<if> 태그로 동적쿼리문 만들기

 

<if> 태그 사용법

<where>
	<if test ="조건식">
    		{참일 시 동작할 구문}
    	</if>
</where>

 

<if>태그 사용 예시

 

<where> 태그를 이용해서 SQL문의 WHERE절을 구성합니다.

email과 phoneNum은 화면단에서 검색한 값에 따라서 유동적으로 조건절이 바뀌도록 구성한 예제입니다.

 

만약, email과 phoneNum이 공백이거나 값이 null이면 두가지 모두 적용이 되지 않고, SELECT * FROM memeber 부분만 동작하는것이다.

<select id="member" resultType="MemberVO" parameterType="memResult">
    SELECT * FROM member
    <where>
    <if test="email !=null and email !=''">
        AND email LIKE '%' || #{email} || '%'
    </if>
    <if test="phoneNum !=null and phoneNum !=''">
        AND phoneNum LIKE '%' || #{phoneNum} || '%'
    </if>
    </where>
    ORDER BY id
</select>

 

 

위의 동적쿼리를 적용한 결과값은 이렇게 된다.

 

1) 화면에서 [ email : id@naver.com | phoneNum : 010 ] 으로 검색을 누를 경우 동작하는 쿼리문은 아래와 같다.

 

SELECT * FROM member
WHERE email LIKE '%id@naver.com%'
AND phoneNum LIKE '%010%'
ORDER BY id;

 

 

2) 화면에서 [ email : id@naver.com | phoneNum : (입력하지 않은 공백) ] 으로 검색을 누를 경우 동작하는 쿼리문은 아래와 같다.

 

SELECT * FROM member
WHERE email LIKE '%id@naver.com%'
ORDER BY id;

 

 

3) 화면에서 [ email : (입력하지 않은 공백) | phoneNum : (입력하지 않은 공백) ] 으로 검색을 누를 경우 동작하는 쿼리문은 아래와 같다.

 

SELECT * FROM member
ORDER BY id;

 

 


 

<choose> 태그로 동적쿼리문 만들기

 

 

<choose> 태그 사용법

 

<choose>
	<when test ="조건식1">
    		{구문1}
    	</when>
        <when test="조건식2">
        	{구문2}
        </when>
            ...
        <otherwise>
            {구문 n+1}
        </otherwise>
</choose>

 

 

<choose> 태그 사용 예시

 

<select id="member" resultType="MemberVO" parameterType="memResult">
    SELECT * FROM member
    <where>
    	<choose>
    		<when test="name !=null and name !='' and email !=null and email !=''">
        		name = #{name} AND email = #{email}
    		</when>
    		<when test="name !=null and name !=''">
        		name = #{name}
    		</when>
            	<when test="email !=null and email !=''">
        		email = #{email}
    		</when>
        </choose>
    </where>
    ORDER BY id
</select>

 

 


 

<foreach> 태그로 동적쿼리문 만들기

 

<foreach> 태그 사용법

<foreach item="item" collection="list" open="(" close=")" separator=",">
	#{item}
</foreach>

 

 

 


 

 

게시글이 도움이 되었다면

[로그인]이 필요 없는 ❤ 눌러주세요:)

반응형