Day 59

ChangWoo·2022년 11월 28일
0

중앙 HTA

목록 보기
12/51

동적 쿼리를 사용하지 않을 때

동적 쿼리를 사용 할 때

  • dynamic : 쿼리가 dynamic하게 변하게끔 해준다. (어떨때는 실행되고 어떨때는 실행되지 않게 해준다.)
  • 형식 : 조건문 and 조건문
board/list.jsp

<%@page import="com.sample.util.Pagination"%>
<%@page import="com.sample.vo.User"%>
<%@page import="com.sample.vo.Board"%>
<%@page import="java.util.List"%>
<%@page import="com.sample.dao.BoardDao"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="com.sample.util.StringUtils"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
<title>익명 게시판</title>
</head>
<body>
<jsp:include page="../common/header.jsp">
	<jsp:param name="menu" value="board"/>
</jsp:include>
<div class="container my-3">
<%
	int currentPage = StringUtils.stringToInt(request.getParameter("page"), 1);
	String keyword = StringUtils.nullToValue(request.getParameter("keyword"), "");
	
	BoardDao boardDao = new BoardDao();
	
	Map<String, Object> param = new HashMap<>();
	if (!keyword.isEmpty()){
		param.put("keyword", keyword);
	}

	// 게시글 갯수 조회
	int totalRows = boardDao.getTotalRows(param);
	// Pagination 객체를 생성
	
	// 게시글 목록 조회
	param.put("begin", 1);	
	param.put("end", 10);	
%>
	<h1 class="mb-3 fs-4 border p-2 bg-light">게시글 리스트</h1>
	<div class="d-flex justify-content-between">
		<p>게시글 목록을 확인하세요.</p> 
		<form class="row row-cols-lg-auto g-3 align-items-center" action="list.jsp">
			<div class="col-12">
				<input type="text" class="form-control form-control-sm" name="keyword">
			</div>
			<div class="col-12">
				<button type="submit" class="btn btn-primary btn-sm">검색</button>
			</div>
		</form>
	</div>
	
	<table class="table">
		<thead>
			<tr>
				<th>번호</th>
				<th>제목</th>
				<th>작성자</th>
				<th>조회수</th>
				<th>리뷰갯수</th>
				<th>등록일</th>
			</tr>
		</thead>
		<tbody>
			<tr><td class="text-center" colspan="6"> 게시글 정보가 없습니다. </td></tr>
			<tr>
				<td>1000</td>
				<td><a href="detail.jsp?no=1000">글쓰기 연습</a></td>
				<td>king</td>
				<td>0</td>
				<td>0</td>
				<td>2022-11-11</td>
			</tr>
		</tbody>
	</table>
	
	<div aria-label="navigation">
		<ul class="pagination justify-content-center">
			<li class="page-item">
				<a class="page-link"  href="">이전</a>
			</li>

			<li class="page-item">
				<a class="page-link"  href="" >1</a>
			</li>

			<li class="page-item">
				<a class="page-link" href="" >다음</a>
			</li>
		</ul>
	</div>
	<div>
		<a href="form.jsp" class="btn btn-primary btn-sm float-end">새 글 등록</a>
	</div>
</div>
</body>
</html>

검색 실행 시

StringUtils.java

package com.sample.util;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StringUtils {

	private static final DecimalFormat decimalFormat = new DecimalFormat("#,###.##");
	private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy년 M월 d일");
	
	/**
	 * 텍스트를 전달받아서, 그 값이 null이면 defaultValue로 지정된 값을 반환한다.
	 * @param str 문자열
	 * @param defaultValue 기본값
	 * @return str이 null이면 defaultValue를 반환한다.
	 */
	public static String nullToValue(String str, String defaultValue) {
		if (str == null) {
			return defaultValue;
		}
		return str.trim();
	}
	
	/**
	 * 텍스트를 전달받아서, 그 값이 null이면 빈 문자열을 반환한다.
	 * @param str 문자열
	 * @return str이 null이면 빈 문자열을 반환한다.
	 */
	public static String nullToBlank(String str) {
		return nullToValue(str, "");
	}
	
	
	/**
	 * 텍스트를 전달받아서 정수로 변환한 다음 반환한다. 정수로 변환이 실패하는 경우 0을 반환한다.
	 * @param text 숫자로만 구성된 텍스트
	 * @return 정수, 변환에 실패하는 0이 반환된다.
	 */
	public static int stringToInt(String text) {
		return StringUtils.stringToInt(text, 0);
	}
	
	/**
	 * 텍스트를 전달받아서 정수로 변환한 다음 반환한다. 정수로 변환이 실패하는 경우 전달받은 기본값을 반환한다.
	 * @param text 숫자로만 구성된 텍스트
	 * @param defaultValue 기본값
	 * @return 정수, 변환에 실패하는 기본값이 반환된다.
	 */
	public static int stringToInt(String text, int defaultValue) {
		if (text == null) {
			return defaultValue;
		}
		
		try {
			return Integer.parseInt(text);
		} catch (NumberFormatException ex) {
			return defaultValue;
		}
	}
	
	/**
	 * Date를 "2022년 11월 10일" 형식의 문자열로 변환해서 반환한다.
	 * @param date 날짜
	 * @return 년월일 형식의 문자열, 날짜가 null이면 빈 문자열을 반환한다.
	 */
	public static String dateToText(Date date) {
		if (date == null) {
			return "";
		}
		return simpleDateFormat.format(date);
	}	
	
	/**
	 * 정수를 3자리마다 ,가 포함된 문자열로 변환해서 반환한다.
	 * @param number 정수
	 * @return ,가 포함된 문자열
	 */
	public static String numberToText(long number) {
		return decimalFormat.format(number);
	}
	
	/**
	 * 실수를 소숫점 3번째 자리에서 반올림하고, 정수부는 3자리마다 ,가 포함된 문자열로 변환해서 반환한다.
	 * @param number 실수
	 * @return ,가 포함된 문자열(소숫점 3번째 자리에서 반올림한다.)
	 */
	public static String numberToText(double number) {
		return decimalFormat.format(number);
	}
}
BoardDao.java
public int getTotalRows(Map<String, Object> param ) {
		return (Integer) SqlMapper.selectOne("boards.getTotalRows", param);
	}
boards.xml
<select id="getTotalRows" resultClass="int">
		select
			count(*)
		from
			sample_boards
		where
			board_deleted = 'N'
		<dynamic>	<!-- 동적쿼리 시작 -->
         <isNotNull property="keyword"> <!-- 동적쿼리 추가 조건 시작  -->
            and board_title like '%' || #keyword# || '%'
         </isNotNull>					<!-- 동적쿼리 추가 조건 끝 -->
      </dynamic>	<!-- 동적쿼리 끝 -->
	</select>

실행 결과

코드를 입력하세요

"연습"을 검색 하였을 떄

  • 이전/ 다음 버튼을 눌러도 검색결과가 나온다.
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글