개발/스프링

11. 스프링 프레임워크 - 마이바티스의 동적 SQL문[자바웹을 다루는 기술]

괴발자-K 2022. 5. 20. 15:23

MyBatis 동적 SQL

마이바티스의 가장 강력한 기능 중 하나로 동적SQL을 말 할수 있습니다.

예를 들어 

 

1. SELECT * FROM member;

2. SELECT * FROM member where id = 'park'

3. SELECT * FROM member where id = 'park' and pwd='1234'

 

이 세가지 SQL문은 조건문만 다를 쁜 같은 구조의 SQL문이다. 그렇다면 서로 다른 조건이 10가지 이상이 된다면 

조건이 다른 SQL문을 10가지 이상 작성해야 합니다. 하지만 마이바티의 동적SQL 기능을 이용한다면 한 개의 SQL

문으로 구현이 가능 합니다. 즉, 공통 SQL문에 대해 조건 값의 유무에 따라 동적으로 공통 SQL문에 조건절을 추가

하면 됩니다. 

 

마이바티스 동적SQL문의 특징

  • SQL문의 조건절에서 사용
  • 조건절에 조건을 동적으로 추가
  •  JSTL과 XML기반으로 동적 SQL문을 작성

 

마이바티스 동적SQL문 구성 종류

종류
if
choose(when, otherwise)
trim(where, set)
foreach

 

1. 동적 SQL : <if> 태그

<if>태그 사용 법
<where>
    <if test='조건식'>
        --추가할 SQL문 
    </if>
<where>
실제 예시 SQL문
<!--select문 <where>태그를 이용해 sql문의 where절을 동적으로 구성  -->
  <select id="searchMember" parameterType="memberVO" resultMap="memResult">
              select * from t_member
              <where>
                  <if test="name != '' and name != null">
                     name = #{name}
                  </if>
                  <if test="email != '' and email != null">
                     email = #{email}
                  </if>
              </where>
   </select>
  1. name이 공백이 아니거나 null이 아니면 조건절에 name 조건식을 추가 
  2. email이 공백이 아니거나 null이 아니면 조건절에 email 조건식을 추가

name과 email 조건이 모두 true이면 조건절에는 아무것도 추가가 되지않습니다. (공백이거나 null일 경우)

 

2. 동적 SQL : <choose> 태그

<choose> 태그 사용법
<choose>
    <when test="조건식1">
         구문1
    </when>
    <when test="조건식2">
        구문2
    </when>
     ....
    <otherwise>
        구문 n+1
    </otherwise>
</choose>
실제 예시 SQL문
<!-- <sql> 태그를 이용해 공통 SQL문의 refid를 이용해 사용  -->
    <sql id="a">
         select * from t_member
    </sql>
    
    <!-- <include> 태그를 이용해 공통 SQL문을 재사용   -->
    <select id="searchMember" parameterType="memberVO" resultMap="memResult">
        <include refid="a"/>
         
         <where>
            <choose>
               <when test="name !='' and name != null and email != '' and email != null">
                    name=#{name} and email=#{email}
               </when>
               <when test="name != '' and name != null ">
                     name=#{name}
               </when>
               <when test="email != '' and email != null">
                     email=#{email}
               </when>
            </choose>
         </where>
    </select>
  1. name과 email의 값이 모두 있으면 where절에 name과 email 조건식을 추가
  2. name만 값이 있으면 where절에 name 조건식만 추가
  3. email만 값이 있으면 where절에 email 조건식만 추가

실행 결과는 <if> 태그와 동일 합니다.

3. 동적 SQL : <foreach> 태그

<foreach>태그 사용 법
<foreach item="item" collection="list" index="index" open=" (" close=")" separator=",">
     #{item}
</foreach>

 

<foreach> 태그에 관련된 속성

속성 설명
collection 전달받은 인자 값을 의미하며, 배열과 List 계열 인스턴스를 전달 할 수 있습니다. List 인스턴스 전달 시에는 list로 표시하고 배열 전달 시에는 array로 표시 합니다.
index foreach 문이 반복될 때마다 1씩 증가시키면서 접근하는 값의 위치를 나타냅니다. 최초 값의 위치는 
0 입니다.
item 반복문이 실행될 때마다 collection 속성에 지정된 값에 접근하여 차례대로 사용합니다.
open 해당 구문이 시작될 때의 지정한 기호를 추가합니다.
close 해당 구문이 끝날 때의 지정한 기호를 추가합니다.
separator 한 번 이상 반복될 때 반복되는 사이에 지정한 기호를 추가합니다.
실제 예시 SQL문
<!--foreach문을 이용해 반복해서 list의 값을 표시  -->
    <select id="foreachSelect" resultMap="memResult" parameterType="java.util.Map">
       <include refid="a"/>
       where name in
       <foreach item="item" collection="list" open="(" separator="," close=")">
            #{item}
       </foreach>
       order by joinDate desc
    </select>

끝!

 

#MyBatis 동적 SQL문

https://mybatis.org/mybatis-3/ko/dynamic-sql.html