반응형
여기서 끝내려고 했으나 추가적으로 리스트에 검색 기능 까지만 추가를 해볼것이다.
- sql 파일에 if문을 줘서 검색이 있을시 추가로 돌릴 코드를 추가
맨 아래
order by insert_date desc
]]>
를 지워주고 추가로 이렇게 작성을 한다.
where 1 = 1
]]>
<if test="keyword != null and keyword != ''">
and (title like CONCAT('%',#{keyword},'%') or category like CONCAT('%',#{keyword},'%'))
</if>
order by insert_date desc
결국 최종 select 는 이렇게 된다.
book_SQL.xml
<select id="select_list" parameterType="hashMap" resultType="hashMap">
<![CDATA[
select
book_id,
title,
category,
price,
insert_date
from
book
where 1 = 1
]]>
<if test="keyword != null and keyword != ''">
and (title like CONCAT('%',#{keyword},'%') or category like CONCAT('%',#{keyword},'%'))
</if>
order by insert_date desc
</select>
간단하게 설명을 하자면 order by는 항상 쿼리의 마지막에 와야하므로 뒤로 빼고 검색할시에 keyword 부분이 null이 아니라면 where 문에 and 부터 비교절이 들어간다.
where 이하절에는 true인 값이 있어야하는데 where 1=1 은 항상 참이기에 코드를 이렇게 동적 쿼리로 짰다.
concat함수는 데이터베이스에서 string 값을 붙일때 사용하는 함수이고 %는 와일드 기호라고 하여 어떤 단어나 문자열이든 올수 있음을 뜻한다.
다음은 컨트롤러 부분에 dao로 검색값을 넘겨주는 코드를 추가해보자.
mav에 data를 담는것처럼 하나 더 추가하여 키워드를 담는다.
이렇게 될것이다.
- bookController.java 수정
@RequestMapping(value = "list")
public ModelAndView list(@RequestParam Map<String, Object> map) {
List<Map<String, Object>> list = this.bookService.list(map);
ModelAndView mav = new ModelAndView();
mav.addObject("data", list);
if (map.containsKey("keyword")) {
mav.addObject("keyword", map.get("keyword"));
}
mav.setViewName("/book/list");
return mav;
}
전체 코드는 이렇게 된다.다음은 view에서 테이블 전에 검색어를 입력받을 칸을 만들어주자.
- list.jsp 수정
<%@ page pageEncoding="UTF-8" contentType="text/html;charset=utf-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>책 목록</title>
</head>
<body>
<h1>책 목록</h1>
<p>
<form>
<input type="text" placeholder="검색" name="keyword" value="${keyword}" />
<input type="submit" value="검색" />
</form>
</p>
<table>
<thead>
<tr>
<td>제목</td>
<td>카테고리</td>
<td>가격</td>
</tr>
</thead>
<tbody>
<c:forEach var="row" items="${data}">
<tr>
<td><a href="/detail?bookId=${row.book_id}"> ${row.title}
</a></td>
<td>${row.category}</td>
<td><fmt:formatNumber type="number" maxFractionDigits="3"
value="${row.price}" /></td>
</tr>
</c:forEach>
</tbody>
</table>
<p>
<a href="/create">생성</a>
</p>
</body>
</html>
그럼 이렇게 일부분을 검색해도 리스트에 나오게 된다.
다음 포스팅에서는 spring 에 대한 마무리 얘기로 spring 포스팅을 끝내볼것이다.
반응형
'IT > Java' 카테고리의 다른 글
Long,long / int,Integer 차이 (6) | 2022.01.03 |
---|---|
spring 예제 part.final (0) | 2021.12.27 |
spring 예제 part.11 (0) | 2021.12.25 |
spring 예제 part.10 (0) | 2021.12.24 |
spring 예제 part.9 (0) | 2021.12.23 |
댓글