[Spring Boot] 단일 검색, 다중 검색 처리, MyBatis의 동적 태그
검색 처리
- 단일 항목 검색
제목/내용/작성자
- 다중 항목 검색
제목 or 내용, 제목 or 작성자, 내용 or 작성자, 제목 or 내용 or 작성자
MyBatis의 동적 태그들
if
choose(when, otherwise)
where
trim
foreach
[if]
- 검색 조건 'T' : 제목이 키워드(사용자가 입력한 값)인 항목을 검색
<if test="type=='T'.toString()">
TITLE LIKE '%'||#{keyword}||'%'
</if>
- 검색 조건 'C' : 제목이 키워드(사용자가 입력한 값)인 항목을 검색
<if test="type=='C'.toString()">
TITLE LIKE '%'||#{keyword}||'%'
</if>
- 검색 조건 'W' : 제목이 키워드(사용자가 입력한 값)인 항목을 검색
<if test="type=='W'.toString()">
TITLE LIKE '%'||#{keyword}||'%'
</if>
[choose]
<choose>
<when test="type=='T'.toString()">
TITLE LIKE '%'||#{keyword}||'%'
<when>
<when test="type=='C'.toString()">
TITLE LIKE '%'||#{keyword}||'%'
<when>
<when test="type=='W'.toString()">
TITLE LIKE '%'||#{keyword}||'%'
<when>
<otherwise>
TITLE LIKE '%'||#{keyword}||'%' OR CONTENT LIKE '%'||#{keyword}||'%' OR WRITER LIKE '%'||#{keyword}||'%'
</otherwise>
</choose>
[where]
SELECT * FROM TBL_BOARD
<where> //안에 아무것도 없을때는 where절이 붙지 않습니다.
<if test="bno !=null">
BNO = #{bno}
</if>
</where>
[trim]
SELECT * FROM TBL_BOARD
<where>
<if test="bno != null>
BNO= #{bno}
</if>
<trim prefixOverrides="AND"> //앞에 and를 붙이고 위에 if문이 false라면 무시하겠다라는 뜻입니다..
ROWNUM = 1
</trim>
</where>
*bno가 null일 때
SELECT * FROM TBL_BOARD WHERE ROWNUM = 1
*bno가 null이 아닐 때
SELECT * FROM TBL_BOARD WHERE BNO=값 AND ROWNUM =1
*prefix만 쓸떄는 무조건 AND가 붙습니다.
*suffix : 마지막에 무조건 붙여줍니다.
<foreach>
List, 배열, Map 등을 이용해서 루프를 처리합니다.
SELECT * FROM TBL_BOARD
<trim prefix="WHERE(" suffix=")" prefixOverrides="OR">
<foreach item="item" index="index" collection = "getter메소드의 원래 이름">
<trim prefix="OR">
<if test="item=='T'.toString()">
TITLE LIKE '%'||#{keyword}||'%'
</if>
<if test="item=='C'.toString()">
CONTENT LIKE '%'||#{keyword}||'%'
</if>
<if test="item=='W'.toString()">
WRITER LIKE '%'||#{keyword}||'%'
</if>
</trim>
</foreach>
</trim>
SELECT * FROM TBL_BOARD WHERE(TITLE LIKE '%검색어'%'
OR CONTENT LIKE '%검색어'%' OR WRITER LIKE '%검색어'%' )
검색처리
Criteria클래스 수정
mapper.xml
//sql id="search" 로 따로 분리 하여
// <include refid="search"></include> 로 분리합니다.
<sql id="search">
<if test="type != null and keyword != null">
<trim prefix="(" suffix=") AND " prefixOverrides="OR">
<foreach item="type" collection="typeArr">
<trim prefix="OR">
<choose>
<when test="type =='T'.toString()">
(TITLE LIKE '%'||#{keyword})||'%')
</when>
<when test="type =='C'.toString()">
(CONTENT LIKE '%'||#{keyword})||'%')
</when>
<when test="type =='W'.toString()">
(WRITER LIKE '%'||#{keyword})||'%')
</when>
</choose>
</trim>
</foreach>
</trim>
</if>
</sql>
<select id="getList" resultType="boardVO">
<![CDATA[
SELECT BNO, TITLE, CONTENT, WRITER, REGDATE, UPDATEDATE
FROM
(
/*알리아스를 붙인 컬럼에 WHERE절에서 접근할 때에는 FROM절에 작성된 테이블의 컬럼과 동일한 이름으로만 사용이 가능하다.*/
SELECT /*+ INDEX_DESC(TBL_BOARD PK_BOARD) */
ROWNUM R, BNO, TITLE, CONTENT, WRITER, REGDATE, UPDATEDATE
FROM TBL_BOARD
WHERE
]]>
<include refid="search"></include>
<![CDATA[
ROWNUM <= #{pageNum} * #{amount}
)
WHERE R > (#{pageNum} - 1) * #{amount}
]]>
</select>
<select id="getTotal" resultType="_int">
SELECT COUNT(BNO) FROM TBL_BOARD
<where>
<include refid="search"></include>
</where>
</select>
mapper.java , DAO , SERVICE , CONTROLLER 를 모두 수정합니다.
list.html에서 검색 form만들어줍니다.
<form action="/board/list" name="searchForm">
<div class="fields">
<div class="field">
<div id="searchWarp">
<select name="type">
<option value="">검색 기준</option>
<option value="T">제목</option>
<option value="C">내용</option>
<option value="W">작성자</option>
<option value="TC">제목 또는 내용</option>
<option value="TW">제목 도는 작성자</option>
<option value="TCW">제목 또는 내용 또는 작성자</option>
</select>
<input id="keyword" type="text" name="keyword">
<a href="javascript:void(0)" class="search button primary icon solid fa-search">검색</a>
</div>
</div>
</div>
</form>
<script th:inline="javascript">
$("a.search").on("click", function(e){
e.preventDefault();
if(!searchForm.find("option:selected").val()){
alert("검색 종류를 선택하세요");
return;
}
if(!searchForm.find("input#keyword").val()){
alert("키워드를 입력하세요");
return;
}
searchForm.submit();
});
</script>
잘 나오는것을 확인할 수 있습니다.!!!!!
'KoreaIt Academy > Spring Boot' 카테고리의 다른 글
[Spring Boot] REST 방식 - ResponseEntity을 사용한 댓글 수정(PUT, PATCH) , 삭제(DELETE) (0) | 2021.10.14 |
---|---|
[Spring Boot] @Controller와 @RestController의 차이, REST 방식 사용법(Ajax) - 댓글 등록, 조회 (0) | 2021.10.14 |
[Spring Boot] UriComponentsBuilder - 파라미터 연결(페이지 유지) (0) | 2021.10.13 |
[Spring Boot] 페이징 처리 - Criteria, PageDTO (2) | 2021.10.13 |
[Spring Boot] 템플릿 엔진( View Template Engine) Thymeleaf (0) | 2021.10.13 |
댓글