yunyj99
라둥이
yunyj99
GitHub
전체 방문자
오늘
어제
  • 분류 전체보기 (309)
    • 1. 프로그래밍 (50)
      • 1-1. Git (17)
      • 1-2. Java (13)
      • 1-2-1. Java GUI (1)
      • 오류 (12)
      • 기타 (7)
    • 2. Front-end (57)
      • 2-1. HTML (5)
      • 2-2. CSS (19)
      • 2-3. Java Script (33)
      • 2-4. React (0)
    • 3. Back-end (47)
      • 3-1. Spring MVC - 국비 (15)
      • 3-2. Spring MVC - 남궁성 (30)
      • 3-3. Spring - 김영한 (2)
    • 4. Android (1)
    • 5. DB (20)
      • 4-1. MySQL DBMS (20)
    • 6. 자료구조 & 알고리즘 (44)
      • 6-1. 자료구조 (14)
      • 6-2. 백준 (30)
    • 7. 웹 디자인 (7)
      • 7-1. UX 디자인 (7)
    • 8. 자격증 (35)
      • 8-1. 정보처리기사 (35)
    • 프로젝트 (3)
      • 프로젝트 기록 (3)
    • etc... (43)
      • 패스트캠퍼스 챌린지 (39)
      • 잡담 (4)

블로그 메뉴

  • 홈
  • 태그

최근 글

티스토리

hELLO · Designed By 정상우.
yunyj99

라둥이

쓰기
3. Back-end/3-2. Spring MVC - 남궁성

SpringMVC - [ MyBatis 동적 쿼리 ]

2023. 4. 4. 00:10

1. <sql>과 <include>

 공통 부분을 <sql> 로 정의하고, <include>로 포함시켜 재사용할 수 있다.

 

예를 들어 아래와 같이 두 개의 sql문이 있을 때

<select id="select" parameterType="int" resultType="BoardDto">
	SELECT bno, title, content, writer, view_cnt, comment_cnt, reg_date
	FROM board
	WHERE bno=#{bno}
</select>

<select id="select" parameterType="int" resultType="BoardDto">
	SELECT bno, title, content, writer, view_cnt, comment_cnt, reg_date
    FROM board
    ORDER BY reg_Date, DESC, bno DESC
    LIMIT #{offset}, #{pageSize}
</select>

이런 식으로 공통 부분을 <sql>로 빼내어 사용할 수 있다.

<sql id="selectFromBoard">
    SELECT bno, title, content, writer, view_cnt, comment_cnt, reg_date
    FROM board
</sql>

<select id="select" parameterType="int" resultType="BoardDto">
    <include refid="selectFromBoard"/>
    WHERE bno = #{bno}
</select>

<select id="selectPage" parameterType="map" resultType="BoardDto">
    <include refid="selectFromBoard"/>
    ORDER BY reg_date DESC, bno DESC
    LIMIT #{offset}, #{pageSize}
</select>

 

 

 

 


2. <if>

사실 아래의 예시에서 option은 셋 중 하나이므로 if보단 choose가 더 어울린다.

<select id="searchResultCnt" parameterType="SearchCondition" resultType="int">
    SELECT count(*)
    FROM board
    WHERE true	-- 뒤에 AND가 오기 때문에 true로 시작
    <if test='option=="A"'>
        AND (title	LIKE concat('%', #{keyword}, '%')
        OR content	LIKE concat('%', #{keyword), '%')) 
    </if> 
    <if test='option=="T"'>
        AND title LIKE concat('%', #{keyword}, '%')
    </if>
    <if test='option=="W"'>
        AND writer LIKE concat('%', #{keyword}, '%')
    </if>
</select>

 

 

 

 


3. <choose> <when>

choose 에서는 when에서 true인 조건을 찾으면 뒤의 조건은 확인하지 않는다.

일치하는 조건이 없으면 otherwise의 문장이 실행된다.

<select id="searchResultCnt" parameterType="SearchCondition" resultType="int">
	SELECT count(*)
	FROM board
	WHERE true 
	<choose>
		<when test='option=="T"'>
			AND title LIKE concat ('%', #{keyword}, '%')
		</when>
		<when test='option=="W"'>
			AND writer LIKE concat('%', #{keyword}, '%') 
		</when>
		<otherwise>
			AND (title LIKE concat ('%', #{keyword}, '%')
			OR content LIKE concat('%', #{keyword}, '%'))
		</otherwise>
	</choose>
< select>

 

 

 


4. <foreach>

아래에서 foreach안의 문장은 괄호( )를 시작과 끝으로 구분자 , 를 줘서 만들어준다.

collection 값이 array 이므로 Integer[] 과 같은 배열 값을 인자로 넘겨줄 수 있다.

즉 넘어온 배열 값이 {1,2,3} 이면 => (1, 2, 3) 이런 식으로 만들어줘서 bno IN (1, 2, 3) 과 같은 문장이 된다.

<select id="getSelected" resultType="BoardDto">
	SELECT bno, title, content, writer, view_cnt, comment_cnt, reg_date
	FROM board
	WHERE bno IN
	<foreach collection="array" item="bno" open="(" close=")" separator=",">
		#{bno}
	</foreach>
	ORDER BY reg_date DESC, bno DESC 
</select>

 

 

 

 


와일드카드

MySQL에서 와일드 카드는 %(0~여러 글자),  _(한 글자) 가 있다.

 


참조

https://fastcampus.co.kr/dev_academy_nks

 

스프링의 정석 : 남궁성과 끝까지 간다 | 패스트캠퍼스

국비지원 조기 마감 신화, 베스트셀러 'JAVA의 정석'의 저자 남궁성의 Spring 강의입니다! 오픈톡방과 카페에서 평생 AS를 제공하며 완강과 취업까지 도와드립니다. 지금 할인가로 확인하세요!

fastcampus.co.kr

 

'3. Back-end > 3-2. Spring MVC - 남궁성' 카테고리의 다른 글

SpringMVC - [ REST API와 Ajax ]  (0) 2023.04.18
SpringMVC - [ SQL문 실행 로그 찍기 ]  (0) 2023.04.16
SpringMVC - [ MyBatis ]  (0) 2023.03.26
Spring MVC - [ 서비스 계층의 분리 / Transactional ]  (0) 2023.03.17
Spring MVC - [ AOP ]  (0) 2023.03.09
    '3. Back-end/3-2. Spring MVC - 남궁성' 카테고리의 다른 글
    • SpringMVC - [ REST API와 Ajax ]
    • SpringMVC - [ SQL문 실행 로그 찍기 ]
    • SpringMVC - [ MyBatis ]
    • Spring MVC - [ 서비스 계층의 분리 / Transactional ]
    yunyj99
    yunyj99
    개발자를 목표로 하는, 새싹처럼 성장하고 싶은 사람의 학습 공간 ^v^

    티스토리툴바