동적 쿼리를 사용하지 않을 때
동적 쿼리를 사용 할 때
- 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>
실행 결과
코드를 입력하세요
"연습"을 검색 하였을 떄
- 이전/ 다음 버튼을 눌러도 검색결과가 나온다.