반응형
동적 SQL 필요성
MyBatis의 동적 SQL 기능
--1
select * from board;
--2
select * from board
where title = 'winter';
--3
select * from board
where title = 'winter' and content = 'summer';
위 쿼리 세 개는 게시판에서 SELECT문을 사용하여 데이터를 추출하고 있습니다.
위 세 쿼리들은 조건절만 다르기 때문에 MyBatis의 동적 SQL 기능을 사용하면 세 개의 SQL문을 한 개의 SQL문으로 구현이 가능합니다.
<where> 태그
<!--
이 태그는 WHERE 절을 반환한다.
<where> 안의 하위 태그를 실행하고 나서 반환값이 있으면 WHERE절을 만들어 반환하고
없으면 WHERE절을 반환하지 않는다.
-->
<where>
<if test="조건1">SQL 문</when>
<if test="조건2">SQL 문</when>
</where>
<if> 태그
사용법
<!--
조건이 참인 경우에만 SQL문을 포함한다.(태그의 내용을 반환한다.)
-->
<if test="조건식">SQL 문</if>
예제
--예제1
<select id="selectBoard" parameterType="String" resultType="Board">
SELECT * FROM board
<where>
<if test="id != '' and id != null">
title = #{title}
</if>
<if test="content != '' and content != null">
and content = #{content}
</if>
</where>
order by id desc
</select>
--예제2
<select id="selectBoard2" parameterType="String" resultType="Board">
SELECT * FROM board
WHERE 1=1
<if test="title !='' and title != null">
AND title LIKE CONCAT('%',#{title},'%')
</if>
</select>
- <if> 태그안에는 속성 값을 체크하여 공백이 아니거나 null이 아닌 경우 구문 추가
- 예제 2번 처럼 `WHERE 1=1`을 두고 뒤에 조건식을 붙여도됩니다.
<choose> 태그
사용법
<!--
검사할 조건이 여러 개일 경우 사용한다.
test 속성에 지정된 조건이 참이면 해당 태그 내용 반환
일치하는 조건이 없으면 <otherwise>의 내용을 반환
-->
<choose>
<when test="조건식1">
구문
</when>
<when test="조건식2">
구문
</when>
...
<otherwise>
구문
</otherwise>
</choose>
예제
<!-- 예제1 -->
<select id="selectBoard" parameterType="String" resultType="Board">
select * from board
<where>
<choose>
<when test="title != '' and title != null and content != '' nad content != null">
title=#{title} and content=#{content}
</when>
<when test="title != '' and title != null">
title=#{title}
</when>
<when test="content != '' and content != null">
content=#{content}
</when>
<otherwise>
id = 1
</otherwise>
</choose>
</where>
</select>
<!-- 예제2 -->
<select id="selectList" parameterType="map" resultMap="projectResultMap">
select PNO, PNAME, STA_DATE, END_DATE, STATE
from PROJECTS
order by
<choose>
<when test="orderCond=='TITLE_ASC'">PNAME asc</when>
<when test="orderCond=='TITLE_DESC'">PNAME desc</when>
<when test="orderCond=='STARTDATE_ASC'">STA_DATE asc</when>
<when test="orderCond=='STARTDATE_DESC'">STA_DATE desc</when>
<when test="orderCond=='ENDDATE_ASC'">END_DATE asc</when>
...
<when test="orderCond=='PNO_ASC'">PNO asc</when>
<otherwise>PNO desc</otherwise>
</choose>
</select>
- <otherwise> 태그는 생략할 수 있다.
<trim> 태그
<!--
특정 단어로 시작하는 SQL문을 반환하고 싶을 때 사용한다.
prefix는 반환값 앞에 붙일 접두어를 지정한다.
prefixOverrides는 반환할 값에서 제거해야 하는 접두어를 지정한다.
-->
<trim prefic="단어" prefixOverrides="문자열|문자열">
<if test="조건1">SQL 문</when>
<if test="조건2">SQL 문</when>
</trim>
<set> 태그
<!--
UPDATE 문의 SET 절을 만들 때 사용한다.
조건이 참인 <if>의 내용은 SET 절에 포함된다.
SET 절의 항목이 여러 개일 경우 자동으로 콤마(,)를 붙인다.
-->
<set>
<if test="조건1">SQL 문</when>
<if test="조건2">SQL 문</when>
</set>
<foreach> 엘리먼트
사용법
<!--
목록의 값을 가지고 SQL문을 만들 때 사용한다. 특히 IN(값, 값, ...)조건을 만들 때 좋다.
item 속성: 항목을 가리킬 때 사용할 변수의 이름을 지정
index 속성: foreach문이 반복될 때마다 1씩 증가시키면서 접근하는 값의 위치를 나타냄. 최초 값: 0
collection 속성: java.util.List 구현체나 배열 객체
open 속성: 구문 시작될 때 접두어를 지정
close 속성: 구문 시작될 때 접미어를 지정
separator 속성: 반복으로 생성하는 값을 구분하기 위해 붙이는 문자열을(구분자) 지정
-->
<foreach
item="항목"
index="인덱스"
collection="목록"
open="시작문자열"
close="종료문자열"
separator="구분자">
</foreach>
예제
<select id="foreachSelect" parameterType="java.util.Map" resultMap="memberResult">
SELECT * FROM member
WHERE name IN
<foreach item = "item" collection = "list" open="(" separator"," close=")" >
#{item}
</foreach>
</select>
- SQL문에 배열 혹은 List를 전달하면 자동으로 Map에 전달되어 이름을 key로 사용한다.
- List는 list를 키로 사용
- 배열은 array를 키로 사용
<bind> 태그
<!--
변수를 생성할 때 사용한다.
-->
<bind name="변수명" value="값"/>
UPDATE절을 동적SQL로 처리
<update id="update" parameterType="map">
update PROJECTS
<set>
<if test="title != null and !title.equals('')">
TITLE = #{title},
</if>
<if test="content != null and !content.equals('')">
CONTENT = #{content},
</if>
UPDATE_DATE = NOW()
</set>
where ID=#{id};
</update>
- `<set>` 태그
<set> 태그는 SET 절을 만듭니다. 위 코드로 예시를 든다면 content와 tags의 값이 null이 아니고 빈 문자열이 아닌 경우 다음과 같은 쿼리로 변환되어 처리됩니다.
set TITLE='변경할 제목', CONTENT='변경할 내용'
- 참고: SET절의 끝에 콤마(,)가 있어도 MyBatis에서 마지막에 있는 콤마(,)는 제거하기 때문에 고려하지 않아도 됩니다.
반응형
'MyBatis' 카테고리의 다른 글
MyBatis 마이바티스에서 LIKE문 사용하기 (0) | 2022.09.20 |
---|---|
[mybatis] springMVC + MyBatis 연동 (스프링MVC + 마이바티스) (0) | 2022.09.10 |
[mybatis] mybatis 설정 파일 (0) | 2022.07.21 |
[mybatis] SQL mapper(맵퍼) 파일 (0) | 2022.07.21 |
[mybatis] mybatis 적용 (0) | 2022.07.20 |