buyer가 1이고 prod가 n인 상황
즉 buyer가 주인공!!
ProdVO
package kr.or.ddit;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Data;
//자바빈 클래스
public class ProdVO {
private String prodId;
private String prodName;
private String prodLgu;
private String prodBuyer;
private int prodCost;
private int prodPrice;
private int prodSale;
private String prodOutline;
//오라클 CLOB 자료형일지라도 String 타입으로 선언
private String prodDetail;
private String prodImg;
private int prodTotalstock;
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date prodInsdate;
private int prodProperstock;
private String prodSize;
private String prodColor;
private String prodDelivery;
private String prodUnit;
private int prodQtyin;
private int prodQtysale;
private int prodMileage;
public String getProdId() {
return prodId;
}
public void setProdId(String prodId) {
this.prodId = prodId;
}
public String getProdName() {
return prodName;
}
public void setProdName(String prodName) {
this.prodName = prodName;
}
public String getProdLgu() {
return prodLgu;
}
public void setProdLgu(String prodLgu) {
this.prodLgu = prodLgu;
}
public String getProdBuyer() {
return prodBuyer;
}
public void setProdBuyer(String prodBuyer) {
this.prodBuyer = prodBuyer;
}
public int getProdCost() {
return prodCost;
}
public void setProdCost(int prodCost) {
this.prodCost = prodCost;
}
public int getProdPrice() {
return prodPrice;
}
public void setProdPrice(int prodPrice) {
this.prodPrice = prodPrice;
}
public int getProdSale() {
return prodSale;
}
public void setProdSale(int prodSale) {
this.prodSale = prodSale;
}
public String getProdOutline() {
return prodOutline;
}
public void setProdOutline(String prodOutline) {
this.prodOutline = prodOutline;
}
public String getProdDetail() {
return prodDetail;
}
public void setProdDetail(String prodDetail) {
this.prodDetail = prodDetail;
}
public String getProdImg() {
return prodImg;
}
public void setProdImg(String prodImg) {
this.prodImg = prodImg;
}
public int getProdTotalstock() {
return prodTotalstock;
}
public void setProdTotalstock(int prodTotalstock) {
this.prodTotalstock = prodTotalstock;
}
public Date getProdInsdate() {
return prodInsdate;
}
public void setProdInsdate(Date prodInsdate) {
this.prodInsdate = prodInsdate;
}
public int getProdProperstock() {
return prodProperstock;
}
public void setProdProperstock(int prodProperstock) {
this.prodProperstock = prodProperstock;
}
public String getProdSize() {
return prodSize;
}
public void setProdSize(String prodSize) {
this.prodSize = prodSize;
}
public String getProdColor() {
return prodColor;
}
public void setProdColor(String prodColor) {
this.prodColor = prodColor;
}
public String getProdDelivery() {
return prodDelivery;
}
public void setProdDelivery(String prodDelivery) {
this.prodDelivery = prodDelivery;
}
public String getProdUnit() {
return prodUnit;
}
public void setProdUnit(String prodUnit) {
this.prodUnit = prodUnit;
}
public int getProdQtyin() {
return prodQtyin;
}
public void setProdQtyin(int prodQtyin) {
this.prodQtyin = prodQtyin;
}
public int getProdQtysale() {
return prodQtysale;
}
public void setProdQtysale(int prodQtysale) {
this.prodQtysale = prodQtysale;
}
public int getProdMileage() {
return prodMileage;
}
public void setProdMileage(int prodMileage) {
this.prodMileage = prodMileage;
}
@Override
public String toString() {
return "ProdVO [prodId=" + prodId + ", prodName=" + prodName + ", prodLgu=" + prodLgu + ", prodBuyer="
+ prodBuyer + ", prodCost=" + prodCost + ", prodPrice=" + prodPrice + ", prodSale=" + prodSale
+ ", prodOutline=" + prodOutline + ", prodDetail=" + prodDetail + ", prodImg=" + prodImg
+ ", prodTotalstock=" + prodTotalstock + ", prodInsdate=" + prodInsdate + ", prodProperstock="
+ prodProperstock + ", prodSize=" + prodSize + ", prodColor=" + prodColor + ", prodDelivery="
+ prodDelivery + ", prodUnit=" + prodUnit + ", prodQtyin=" + prodQtyin + ", prodQtysale=" + prodQtysale
+ ", prodMileage=" + prodMileage + "]";
}
}
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>
<title>거래처 별 상품 목록</title>
</head>
<body>
<table border="1">
<tr>
<td>번호</td>
<td>거래처명</td>
<td>상품명</td>
<td>가격</td>
</tr>
<c:set var="i" value="0" />
<!-- buyerVO : 1에 대한 데이터 -->
<c:forEach var="buyerVO" items="${list}" varStatus="stat">
<!-- buyerVO.prodVO : N에 대한 데이터 -->
<c:forEach var="prodVO" items="${buyerVO.prodVO}">
<c:set var="cnt" value="${i=i+1}" />
<tr>
<td>${cnt}</td>
<td>${buyerVO.buyerName}</td>
<td>${prodVO.prodName}</td>
<td>${prodVO.prodSale}</td>
</tr>
</c:forEach>
</c:forEach>
</table>
</body>
</html>
buyer_SQL.xml
sql컬럼(column)에 있는 BUYER_ID를 buyerVO에 있는 buyerId(property)에 매핑해줘!!
collection : 주인공 buyer가 prod를 받기 위해서 작성해주기!!!
CLOB 타입은 javaType="java.lang.String" jdbcType="CLOB" 명시해조야댐
<?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="buyer">
<!-- list를 위함 시작 -->
<resultMap type="buyerVO" id="buyerMap">
<id property="buyerId" column="BUYER_ID" />
<result property="buyerName" column="BUYER_NAME" />
<collection property="prodVO" resultMap="prodMap">
</collection>
</resultMap>
<resultMap type="prodVO" id="prodMap">
<result property="prodBuyer" column="PROD_BUYER" />
<result property="prodId" column="PROD_ID" />
<result property="prodName" column="PROD_NAME" />
<result property="prodSale" column="PROD_SALE" />
<result property="prodDetail" column="PROD_DETAIL" javaType="java.lang.String" jdbcType="CLOB" />
</resultMap>
<!-- list를 위함 끝 -->
<!-- CLOB는 위에 처럼 처리를 해줘야함 / 하지만 VO는 String으로 씀-->
<select id="list" resultMap="buyerMap">
SELECT B.BUYER_ID
, B.BUYER_NAME
, P.PROD_ID
, P.PROD_NAME
, P.PROD_BUYER
, P.PROD_SALE
, P.PROD_DETAIL
FROM BUYER B, PROD P
WHERE B.BUYER_ID = P.PROD_BUYER
ORDER BY BUYER_ID ASC
</select>
</mapper>
BuyerDao.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;
//mapper xml을 실행해주는 클래스.
//어노테이션을 붙여서 이 클래스는 데이터에 접근하는 클래스야~
//Spring에게 알려줘!
//Spring이 데이터를 관리하는 클래스라고 인지해서 자바 빈(java bean)으로 등록해서 관리
@Repository
//자바빈으로 관리(저장소)해줘! 일반 클래스 아니야~ 서블릿으로 컴팻스트해서 자바빈 접근을 해줌
public class BuyerDao {
//sqlSessionTempate 사용
/*
* new 키워드를 통해 직접 생성 안했는데 객체가 생성이 됨!! 싱기방구
* 이게 바로 의존성 주입임!!!(Dependency Injection - DI)
* DI로 주입 받는 것임
* 스프링이 이미 만들어 놓은 sqlSessionTemplate 타입 객체를 BookDao 객체에 주입
* 이 과정은 자동으로 스프링에서 실행되며, 개발자가 직접 객체를 생성하지 않음
* (이것이 바로 IoC: 제어의 역전)
*/
@Autowired//자동 주입
SqlSessionTemplate sqlSessionTemplate;//미리 만들어 놓은 백신(root컨택스트에서 온것)
//거래처 별 상품 목록
public List<BuyerVO> list(){
//namespace.id
return this.sqlSessionTemplate.selectList("buyer.list");
}
BuyerServiceImpl.java
package kr.or.ddit;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
//어노테이션.. 스프링에게 이 클래스는 서비스 클래스임을 알려줌
//스프링이 자바 빈(java bean)으로 등록하여 관리
@Service
public class BuyerServiceImpl implements BuyerService {
//DI(의존성 주입)
@Autowired
BuyerDao buyerDao;
//거래처 별 상품 목록
//메소드 재정의
@Override
public List<BuyerVO> list(){
return this.buyerDao.list();
}
}
BuyerService.java
package kr.or.ddit;
import java.util.List;
public interface BuyerService {
//메소드 시그니처 처리
public List<BuyerVO> list();
public List<LprodVO> list2();
}
BuyerController.java
package kr.or.ddit;
//컨트롤러 어노테이션(Annotation)
//어노테이션이 있는 클래스
//스프링 프레임워크(디자인 패턴 + 라이브러리 집합)기
//웹 브라우저(크롬)의 요청(request)을 받아들이는 컨트롤러라고
//인지해서 자바 빈(java bean)으로 등록해서 관리
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping(value="/buyer")
@Controller // 컨트롤러 지정
public class BuyerController {
//DI(의존성 주입), IoC(제어의 역전)
@Inject
BuyerService buyerService;
@RequestMapping(value="/list")
public String list(Model model) {
List<BuyerVO> list = this.buyerService.list();
model.addAttribute("list", list);
//뷰 경로 지정하는 forward 방식
return "buyer/list";
}
}