똑같은 삽질은 2번 하지 말자

Mybatis 동적쿼리, <include> 문법 사용법 본문

Spring/Mybatis

Mybatis 동적쿼리, <include> 문법 사용법

곽빵 2020. 8. 11. 23:29

1. 기본적인 동적 쿼리

<select id="search" resultMap="searchVo" parameterType="map"> SELECT * FROM KH.EMPLOYEE WHERE ${searchType} = #{keyword} </select>

<select id="search" resultMap="searchVo" parameterType="map"> 
	SELECT * FROM KH.EMPLOYEE WHERE ${searchType} = #{keyword} 
</select>

map 형식으로 검색 타입과 키워드를 받아와서 처리했다.
WHERE 절에서 검색 타입은 ${ } 로 전달하며 키워드는 #{ } 로 전달한다.

${ } 는 파라미터 값이 그대로 들어가며 #{ } 는 파라미터 값이 ' ' 으로 감싸진다.

달라지는 검색 조건에 대응할 수 있다.

2. if문을 이용한 동적 쿼리

<select id="search" resultMap="searchVo"> SELECT * FROM EMPLOYEE WHERE 1=1 <if test="searchType != null and searchType != ''"> AND NAME LIKE '%' || #{keyword} || '%' </if> <if test="gender != null and gender != ''"> AND GENDER = #{gender} </if> </select>

<select id="search" resultMap="searchVo"> 
		SELECT * FROM EMPLOYEE WHERE 1=1 
   <if test="searchType != null and searchType != ''"> 
    	AND NAME LIKE '%' || #{keyword} || '%' 
   </if> 
   <if test="gender != null and gender != ''">
    	AND GENDER = #{gender} 
   </if> 
</select>

if문을 이용한 동적 쿼리 이다.
if문을 이용하는 방법은 EL 처럼 test 속성에 조건을 넣어주면 된다.
SELECT * FROM EMPLOYEE WHERE 1=1
모든 if문의 조건이 맞지 않는 다면 위의 쿼리문의 결과만 리턴될 것이다.
만약 gender 값이 있다면
SELECT * FROM EMPLOYEE WHERE 1=1 AND GENDER = #{gender}
이런 쿼리문으로 동작할 것이다.

3. choose, when, otherwise 를 이용한 동적 쿼리

if문을 이용할 때와 방식은 동일하다.
choose문을 이용하는 방법도 EL 과 같다.

<select id="search" resultMap="searchVo"> SELECT * FROM EMPLOYEE WHERE 1=1 <choose> <when test="searchType != null and searchType != ''"> AND NAME LIKE '%' || #{keyword} || '%' </when> <when test="gender != null and gender != ''"> AND GENDER = #{gender} </when> <otherwise> AND ID = 1 </otherwise> </choose> </select>

<select id="search" resultMap="searchVo"> 
  SELECT * FROM EMPLOYEE WHERE 1=1 
  <choose> 
    <when test="searchType != null and searchType != ''"> 
    	AND NAME LIKE '%' || #{keyword} || '%' 
    </when> 
    <when test="gender != null and gender != ''"> 
    	AND GENDER = #{gender} 
    </when> 
    <otherwise> 
    	AND ID = 1 
    </otherwise> 
  </choose> 
</select>

if문을 이용하면 조건에 맞는 모든 결과를 볼 수 있지만
choose 문을 이용하면 조건에 맞는 한가지 경우만 볼 수 있다.

4. foreach문을 이용한 동적 쿼리

<select id="search3" parameterType="map" resultMap="searchVo"> SELECT EMPLOYEE WHERE ID IN <foreach collection="job" item='item' index='i' open="(" close=")" separator=","> #{item} </foreach> </select>

<select id="search3" parameterType="map" resultMap="searchVo"> 
	SELECT EMPLOYEE WHERE ID IN 
    <foreach collection="job" item='item' index='i' open="(" close=")" separator=","> 
    	#{item} 
    </foreach> 
</select>

foreach문을 이용하면 배열이나 List 등으로 값이 넘어왔을 때 처리해줄 수 있다.
foreach문의 사용법은 EL과 다르다
collection 속성에 배열, List 객체가 들어가며 item 속성은 변수 이름을 지정한다.
index 속성은 인덱스 변수 이름을 지정한다.
open과 close 속성은 collection을 처리할 때 열고 닫는 문자열을 정하는 것이다.
separator 속성은 구분자이다.

open="(" close=")" separator="," 로 설정했기 때문에
(1, 2, 3, 4) 처럼 값이 들어갈 것 이다.

 

5. SELECT 칼럼 문법 재사용

<sql id="common_select_table">id, name, age</sql>
<select id="getMemberInfo">
    SELECT
        <include refid="common_select_table" />
    FROM
        TABLE
</select>
<where>
   <include refid="참조" />
</where>




'Spring > Mybatis' 카테고리의 다른 글

SqlSession 객체  (0) 2019.06.15
Comments