반응형
여승철
INTP 개발자
여승철
  • 분류 전체보기 (376)
    • CS (16)
      • 면접 준비 (7)
      • 운영체제 (0)
      • 네트워크 (2)
      • HTTP (6)
      • 스프링(Spring) IoC 컨테이너 (0)
      • 알고리즘 (1)
    • Web (13)
    • AWS (6)
    • Java (43)
    • JSP & Servlet (65)
      • 개념 (42)
      • 실습 (23)
    • Spring Framework (33)
    • Spring Boot (10)
    • Spring Data (22)
      • JPA (14)
      • Query DSL (7)
      • Redis (1)
    • Spring Security (9)
    • Spring Batch (4)
    • MyBatis (10)
    • Front-End (51)
      • JS (27)
      • Vue.js (17)
      • React (5)
      • JQuery (0)
      • d3.js (2)
    • DBMS (24)
      • SQL, RDBMS (16)
      • MongoDB (5)
      • Redis (3)
    • Kafka (3)
    • 리눅스 (Linux) (4)
    • 디자인 패턴 (3)
    • VCS (8)
    • API (0)
    • TOOL (3)
    • Reading Book (28)
      • 이펙티브 자바 (11)
      • Clean Code (10)
      • 1분 설명력 (4)
      • HOW TO 맥킨지 문제해결의 기술 (3)
    • C# (4)
    • NSIS (6)
    • ETC (11)

블로그 메뉴

  • 홈
  • 태그

인기 글

태그

  • mybatis
  • 맥킨지
  • 환경 세팅
  • Spring Batch
  • controller
  • 로그인
  • 게시판
  • 디자인 패턴
  • servlet
  • jsp
  • 회원 관리
  • ubuntu
  • EC2
  • JDBC
  • querydsl
  • 이펙티브 자바
  • Dao
  • JSTL
  • 스트림
  • HTTP

최근 댓글

최근 글

hELLO· Designed By 정상우.
여승철

INTP 개발자

MyBatis 동적 SQL 사용 (예시. 항목 별 정렬)
MyBatis

MyBatis 동적 SQL 사용 (예시. 항목 별 정렬)

2022. 7. 21. 17:11
반응형

동적 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
    여승철
    여승철

    티스토리툴바