lprod_SQL.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- result라 써도 무방하지만 id라고 쓴것은 기본키임을 밝힌것 -->
<mapper namespace="lprod">
<!-- list2를 위함 시작 -->
<!-- <resultMap type="lprodVO" id="lprodMap">
<result property="lprodId" column="LPROD_ID" />
<result property="lprodGu" column="LPROD_GU" />
<result property="lprodNm" column="LPROD_NM" />
<collection property="buyerVO" resultMap="buyerMap"></collection>
</resultMap>
<resultMap type="buyerVO" id="buyerMap2">
<result property="buyerId" column="BUYER_ID" />
<result property="buyerLgu" column="BUYER_LGU" />
<result property="buyerName" column="BUYER_NAME" />
</resultMap> -->
<!-- list2를 위함 끝 -->
<!-- buyerVO는 LprodVO에 있는 list 멤버 변수 이름임 -->
<resultMap type="lprodVO" id="lprodMap">
<id property="lprodGu" column="LPROD_GU" />
<result property="lprodNm" column="LPROD_NM" />
<collection property="buyerVO" resultMap="buyerMap"></collection>
</resultMap>
<!-- alias에 설정을 해줘서 kr.or.ddit.BuyerVO를 buyerVO로만 입력 가능 -->
<resultMap type="buyerVO" id="buyerMap">
<id property="buyerId" column="BUYER_ID" />
<result property="buyerName" column="BUYER_NAME" />
<result property="buyerLgu" column="BUYER_LGU" />
</resultMap>
<!-- CLOB는 위에 처럼 처리를 해줘야함 / 하지만 VO는 String으로 씀-->
<!-- <select id="list" resultMap="lprodMap">
SELECT B.BUYER_ID
, B.BUYER_NAME
, B.BUYER_LGU
, L.LPROD_ID
, L.LPROD_GU
, L.LPROD_NM
FROM BUYER B, LPROD L
WHERE B.BUYER_LGU = L.LPROD_GU
ORDER BY L.LPROD_GU ASC
</select> -->
<select id="list" resultMap="lprodMap">
select L.LPROD_GU
,L.LPROD_NM
,B.BUYER_ID
,B.BUYER_NAME
,B.BUYER_LGU
from LPROD L INNER JOIN BUYER B
ON(L.LPROD_GU = B.BUYER_LGU)
ORDER BY LPROD_NM
</select>
</mapper>
LprodDao.java
package kr.or.ddit;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
//선생님의 dao 내것은 buyerdao list2에 있음
@Repository //자바빈으로 등록해서 특별관리(일반클래스에 완장 채우는 늒김)
public class LprodDao {
//sqlSessionTempate 사용
/*
* new 키워드를 통해 직접 생성 안했는데 객체가 생성이 됨!! 싱기방구
* 이게 바로 의존성 주입임!!!(Dependency Injection - DI)
* DI로 주입 받는 것임
* 스프링이 이미 만들어 놓은 sqlSessionTemplate 타입 객체를 BookDao 객체에 주입
* 이 과정은 자동으로 스프링에서 실행되며, 개발자가 직접 객체를 생성하지 않음(이것이 바로 IoC: 제어의 역전)
*
*/
@Autowired//자동 주입
SqlSessionTemplate sqlSessionTemplate;//미리 만들어 놓은 백신(root컨택스트에서 온것)
//상품 분류 별 거래처 목록
public List<LprodVO> list(){
return this.sqlSessionTemplate.selectList("lprod.list");
}
}
LprodServiceImpl
package kr.or.ddit;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class LprodServiceImpl implements LprodService {
//DI
@Autowired
LprodDao lprodDao;
//상품 분류 별 거래처 목록
//메소드 재정의
@Override
public List<LprodVO> list(){
return this.lprodDao.list();
}
}
LprodService
package kr.or.ddit;
import java.util.List;
public interface LprodService {
//메소드 시그니처
//상품 분류 별 거래처 목록
public List<LprodVO> list();
}
LprodController.java
package kr.or.ddit;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
//모든 요청들이여 나에게로 오라
@RequestMapping(value="/lprod")
@Controller
public class LprodController {
//org.slf4j패키지..
private static final Logger logger =
LoggerFactory.getLogger(LprodController.class);
@Autowired
LprodService lprodService;
//http://localhost:8090/lprod/list?currentPage=1
@RequestMapping(value="/list", method=RequestMethod.GET)
public String list(Model model, @RequestParam(defaultValue="1") int currentPage) {//int형 으로 사용하는것 유희
//(defaultValue="1"): 파라미터가 없을때 에러가남 그럴때 이것을 써줘야됨
// 해당 요청 파라미터를 지정하지 않을 경우(http://localhost:8090/lprod/list)
// 속성에 지정한 문자열을 값으로 이용하게 됨
logger.info("currnetPage : " + currentPage);
List<LprodVO> list = this.lprodService.list();
logger.info("list.size() : " + list.size());
//new ArticlePage(total, currentPage, size, pagingCount, content)
model.addAttribute("list",
new ArticlePage(list.size(), currentPage, 7, 5, list));//모델 객체에 리스트가 들은것
//forward
return "lprod/list";
}
}
ArticlePage.java
package kr.or.ddit;
import java.util.List;
//페이징 처리를 위한 클래스
//게시글 데이터와 페이징 관련 정보를 담고 있음
public class ArticlePage {
//페이징 관련 멤버변수
//전체 글의 행의 수
private int total;
//현재 페이지 번호
private int currentPage;
//전체 페이지 개수
private int totalPages;
//시작 페이지 번호
private int startPage;
//종료 페이지 번호
private int endPage;
//페이징의 개수
private int pagingCount;
//게시글 데이터
private List<LprodVO> content;
생성자
size : 한 화면에 보여질 행의 수
if(total == 0) {//select 결과가 없다면..
totalPages = 0;
startPage = 0;
endPage = 0;
}else { //select 결과가 있을 때..
전체 페이지 개수 구하기(전체 글의 수 / 한 화면에 보여질 행의 수)
정수와 정수의 나눗셈의 결과는 정수이므로 13 / 7 => 1
totalPages = total / size;
보정해줘야 할 경우는? 15 / 7 = 2 경우 처럼 나머자가 0보다 클 때
if(total % size>0) {
//전체 페이지수를 1 증가 처리
totalPages++;
}
startPage(시작 페이지) : 이전 [1][2] [3][4] [5] 다음 일 때 1을 의미
공식 : startPage = 현재페이지 번호 / 페이징의 개수 * 페이징의 개수 + 1;
startPage = currentPage / pagingCount * pagingCount + 1;
현재페이지 % 5 == 0 일 때
if(currentPage%pagingCount==0) {
//startPage = startPage - 5(페이징의 개수);
startPage -= pagingCount;
}
endPage : 이전 [1][2] [3][4] [5] 다음 일 때 5을 의미
endPage = startPage + (pagingCount-1);
보정해줘야 할 경우는? 5 / 5 * 5 + 1 => 6 경우처럼
보정해줘야 할 경우는? endPage 5 > totalPages 3 일 때
endPage 5를 totalPages 3로 바꿔줘야 함
if(endPage > totalPages) {
endPage = totalPages;
}
}//end outer if
}
//전체 행의 수를 리턴
public int getTotal() {
return this.total;
}
//select결과가 없는가? 체킹 : true면 결과가 없다는 의미
public boolean hasNoArticles() {
return this.total == 0;
}
//select결과가 있는가? 체킹 : true면 결과가 있다는 의미
public boolean hasArticles() {
return this.total > 0;
}
//현재 페이지 번호 리턴
public int getCurrentPage() {
return this.currentPage;
}
//전체 페이지의 개수 리턴
public int getTotalPages() {
return totalPages;
}
//데이터 VO List 리턴
public List<LprodVO> getContent(){
return this.content;
}
//목록 하단의 시작 번호를 리턴
public int getStartPage() {
return this.startPage;
}
//목록 하단의 종료 번호를 리턴
public int getEndPage() {
return this.endPage;
}
}
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>상품분류 별 거래처 목록</title>
<!-- Custom fonts for this template-->
<link href="/resources/sbadmin2/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<link
href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
rel="stylesheet">
<!-- Custom styles for this template-->
<link href="/resources/sbadmin2/css/sb-admin-2.min.css" rel="stylesheet">
</head>
<body id="page-top">
<!-- Page Wrapper -->
<div id="wrapper">
<!-- Sidebar -->
<jsp:include page="../includes/aside.jsp"></jsp:include>
<!-- End of Sidebar -->
<!-- Content Wrapper -->
<div id="content-wrapper" class="d-flex flex-column">
<!-- Main Content -->
<div id="content">
<!-- Topbar -->
<jsp:include page="../includes/header.jsp"></jsp:include>
<!-- End of Topbar -->
<!-- Begin Page Content 본문 시작 -->
<div class="container-fluid">
<!-- Page Heading -->
<h1 class="h3 mb-2 text-gray-800">상품분류 별 거래처 목록</h1>
<p class="mb-4">상품분류 별로 거래처의 목록을 화면에 보여줍니다.</p>
<!-- DataTales Example -->
<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold text-primary">DataTables Example</h6>
</div>
<div class="card-body">
<div class="table-responsive">
<div id="dataTable_wrapper" class="dataTables_wrapper dt-bootstrap4"><div class="row"><div class="col-sm-12 col-md-6"><div class="dataTables_length" id="dataTable_length"><label>Show <select name="dataTable_length" aria-controls="dataTable" class="custom-select custom-select-sm form-control form-control-sm"><option value="10">10</option><option value="25">25</option><option value="50">50</option><option value="100">100</option></select> entries</label></div></div><div class="col-sm-12 col-md-6"><div id="dataTable_filter" class="dataTables_filter"><label>Search:<input type="search" class="form-control form-control-sm" placeholder="" aria-controls="dataTable"></label></div></div></div><div class="row"><div class="col-sm-12"><table class="table table-bordered dataTable" id="dataTable" width="100%" cellspacing="0" role="grid" aria-describedby="dataTable_info" style="width: 100%;">
<thead>
<tr role="row">
<th class="sorting sorting_asc" tabindex="0" aria-controls="dataTable" rowspan="1" colspan="1" aria-sort="ascending" aria-label="Name: activate to sort column descending" style="width: 50px;">번호</th>
<th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1" colspan="1" aria-label="Position: activate to sort column ascending" style="width: 200px;">상품분류코드</th>
<th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1" colspan="1" aria-label="Office: activate to sort column ascending">상품분류명</th>
<th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1" colspan="1" aria-label="Age: activate to sort column ascending" style="width: 200px;">거래처코드</th>
<th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1" colspan="1" aria-label="Start date: activate to sort column ascending">거래처명</th>
</tr>
</thead>
<tfoot>
<tr>
<th rowspan="1" colspan="1">번호</th>
<th rowspan="1" colspan="1">상품분류코드</th>
<th rowspan="1" colspan="1">상품분류명</th>
<th rowspan="1" colspan="1">거래처코드</th>
<th rowspan="1" colspan="1">거래처명</th>
</tr>
</tfoot>
<tbody>
<c:set var="i" value="0" />
<c:forEach var="lprodVO" items="${list.content}">
<c:forEach var="buyerVO" items="${lprodVO.buyerVO}">
<c:set var="cnt" value="${i=i+1}" />
<c:if test="${cnt%2==1}">
<tr class="odd">
</c:if>
<c:if test="${cnt%2==0}">
<tr class="even">
</c:if>
<td class="sorting_1">${cnt}</td>
<td>${lprodVO.lprodGu}</td>
<td>${lprodVO.lprodNm}</td>
<td>${buyerVO.buyerId}</td>
<td>${buyerVO.buyerName}</td>
</tr>
</c:forEach>
</c:forEach>
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-5">
<div class="dataTables_info" id="dataTable_info" role="status" aria-live="polite">
<!-- A*7-6 A*7 -->
Showing ${param.currentPage*7-6} to ${param.currnetPage*7} of {total} entries
</div>
</div>
<div class="col-sm-12 col-md-7">
<div class="dataTables_paginate paging_simple_numbers" id="dataTable_paginate">
<!-- 페이징 처리 시작 -->
<ul class="pagination">
<!-- Previous 시작 -->
<li class="paginate_button page-item previous <c:if test='${list.startPage<6}'>disabled</c:if>" id="dataTable_previous"><a href="/lprod/list?currnetPage=${list.startPage-5}" aria-controls="dataTable" data-dt-idx="0" tabindex="0" class="page-link">Previous</a></li>
<!-- Previous 끝 -->
<!-- Page번호 시작 -->
<c:forEach var="pNo" begin="${list.startPage}" end="${list.endPage}" step="1">
<li class="paginate_button page-item <c:if test='${param.currentPage eq pNo}'>active</c:if>"><a href="/lprod/list?currentPage=${pNo}" aria-controls="dataTable" data-dt-idx="1" tabindex="0" class="page-link">${pNo}</a></li>
</c:forEach>
<!-- Page번호 끝 -->
<!-- Next 시작 : 누르면 6/11/16 페이지로 감 -->
<li class="paginate_button page-item <c:if test='${list.endPage >= list.totalPages}'>disbled</c:if>" id="dataTable_next"><a href="/lprod/list?currentPage=${list.startPage+5}" aria-controls="dataTable" data-dt-idx="7" tabindex="0" class="page-link">Next</a>${list.endPage} ${list.totalPages}</li>
<!-- Next 끝 -->
</ul>
<!-- 페이징 처리 끝 -->
</div></div></div></div>
</div>
</div>
</div>
</div>
<!-- /.container-fluid 본문 끝-->
</div>
<!-- End of Main Content -->
<!-- Footer -->
<jsp:include page="../includes/footer.jsp"></jsp:include>
<!-- End of Footer -->
</div>
<!-- End of Content Wrapper -->
</div>
<!-- End of Page Wrapper -->
<!-- Scroll to Top Button-->
<a class="scroll-to-top rounded" href="#page-top">
<i class="fas fa-angle-up"></i>
</a>
<!-- Logout Modal-->
<div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Ready to Leave?</h5>
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">Select "Logout" below if you are ready to end your current session.</div>
<div class="modal-footer">
<button class="btn btn-secondary" type="button" data-dismiss="modal">Cancel</button>
<a class="btn btn-primary" href="login.html">Logout</a>
</div>
</div>
</div>
</div>
<!-- Bootstrap core JavaScript-->
<script src="/resources/sbadmin2/vendor/jquery/jquery.min.js"></script>
<script src="/resources/sbadmin2/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="/resources/sbadmin2/vendor/jquery-easing/jquery.easing.min.js"></script>
<!-- Custom scripts for all pages-->
<script src="/resources/sbadmin2/js/sb-admin-2.min.js"></script>
<!-- Page level plugins -->
<script src="/resources/sbadmin2/vendor/chart.js/Chart.min.js"></script>
<!-- Page level custom scripts -->
<script src="/resources/sbadmin2/js/demo/chart-area-demo.js"></script>
<script src="/resources/sbadmin2/js/demo/chart-pie-demo.js"></script>
</body>
</html>