'SELECT'에 해당되는 글 2건

  1. 2020.11.25 Mybatis - 동적 쿼리 생성하기
Web&Spring2020. 11. 25. 09:23

 

 

 

Mybatis를 이용하다보면 동적 쿼리를 생성하는 경우가 많이 있다.
파라미터를 넘겼을때, 안넘겼을때..AND 조건 동적으로 붙이기 등..

내가 자주 쓰는 동적 쿼리 문법들을 몇가지 기록해놓는다.

<원본 쿼리>

 

SELECT NAME, GRADE, AGE
  FROM STUDENT

 

 

앞으로..변형을 해보자..

choose)

 

SELECT NAME, GRADE, AGE
<choose>
    <when test="isOnly != '' and isOnly != null">
        FROM STUDENT
    </when>
    <otherwise>
        FROM STUDENT ST
   LFFT JOIN SCHOOL SC
          ON (ST.CODE = SC.CODE)
    </otherwise>
</choose>

 

 

딱 보면 이해가 가는 코드이다.
when과 otherwise를 통해 xml문으로 들어왔을때 파라미터를 가지고 분기를 만들어 주었다.

1. where)

 

SELECT NAME, GRADE, AGE
  FROM STUDENT
 <where>
   AND GRADE >= 3
   AND AGE >= 17
 </where>

 

 

심플하다. <where> 를 넣어줌으로써 where 조건을 쉽게 추가한다. 
이제 1=1 쓰지 말자.

 

 

 

 

 

 

2. if)

 

SELECT NAME, GRADE, AGE
  FROM STUDENT
 <where>
   AND GRADE >= 3
   <if test="age != null and age != ''">
      AND AGE >= #{age}
   </if>
 </where>

 

 

<where>와 결합하였다. 파라미터를 넘어온 값이 있으면 if문안의 쿼리가 동작하는 것이다.
 if문에서 여러가지 문자열을 비교할 방법이 있다. 
예1) 파라미터.equals('ageStr')
예2) 파라미터 eq 'ageStr'.toString()
예3) 파라미터 == 'ageStr'
예4) 파라미터 != 'ageStr'
예5) 파라미터 not eq 'ageStr'.toString()

 

 

 

 

 

3. selectKey)

 

<selectKey keyProperty="sunbeon" order="BEFORE" resultType="Integer">
	SELECT CASE WHEN MAX(SUNBEON) IS NULL THEN 1 ELSE MAX(SUNBEON)+1 END FROM STUDENT
</selectKey>
SELECT NAME, GRADE, AGE, SUNBEON
  FROM STUDENT

 

꽤 유용하게 써먹을 수 있다.
auto increment 로 들어가는 순번이라는 키값에 selectKey 값을 이용하여 최신 키 번호를 가져올 수 있고, select해 온 list에도 키값을 넣어주어 view 작업까지 편하게 도와준다.
(사실 영어 단어로 컬럼명 쓰고 있었으면..SUNBEON이라고 컬럼이름을 지으면 안된다..ORDER..등으로 했어야지)

 

 

 

 

4. foreach)

 

SELECT NAME, GRADE, AGE, SUNBEON
  FROM STUDENT
<where>
    AND SUNBEON IN(<foreach collection="arraySunbeon" item="sunbeon" separator=",">#{sunbeon}</foreach>)
</where>

 

 

foreach 문이다. 키값을 여러개 배열로 파라미터로 전달 한 후 쿼리를 동적으로 완성할 수 있다.
separator는 문장의 구분자이고, item은 반복문안에서 사용할 변수, 그리고 collection은 내가 넘긴 파라미터 변수명이다.


Trim은 제낌..ㅋㅋ

한가지 생각해볼 것이 있다!!!
동적 쿼리는 데이터베이스 에서 캐싱을 하지 않는다.
드라이브 테이블 기능이 제대로 먹지 않는다는..
DB 공부를 더 하다가 알게되었다..ㅎㅎ
당장에는 연관이 없어도 나중에 생각해야될 날이 올 수도 있겠지~?ㅎㅎ

Posted by 사슴영혼'-'