20220817_wed
실습내용
- 다음에 들어갈 item_code를 먼저 조회한다
- 조회한 itemCode를 갖는 상품 정보를 DB에 등록한다
- 상품을 등록할 때 첨부한 이미지파일 정보를 이미지의 갯수만틈 DB에 등록한다.
-위 모든 것을 실행하면,
-이미지 첨부파일 때문에(main,sub) 최소 2대에서 최대 4개까지의 쿼리가 실행된다.
-그래서 트랜잭션 처리가 필요하다!!!
-단, 상품등록은 딱 한 번만 해야 한다!
DB 파일명: 연습용.sql
SELECT * FROM EMP WHERE EMPNO < 1005
UNION ALL -- 조회된 데이터를 동시에 여러개 조회 가능하게 한다.
SELECT * FROM EMP WHERE EMPNO > 1005;
SELECT ENAME FROM EMP WHERE EMPNO < 1005
UNION ALL -- 조회된 데이터를 동시에 여러개 조회 가능하게 한다.
SELECT EMPNO FROM EMP WHERE EMPNO > 1005;
--(오류) 조회할때 컬럼이 다르면 UNION 조회가 안된다!
SELECT ENAME FROM EMP WHERE EMPNO < 1005
UNION ALL -- 조회된 데이터를 동시에 여러개 조회 가능하게 한다.
SELECT JOB FROM EMP WHERE EMPNO > 1005;
--컬럼은 달라도 자료형만 일치하면 UNION 조회가능하다!
SELECT EMPNO,ENAMEM,SAL FROM EMP WHERE EMPNO < 1005
UNION ALL -- 조회된 데이터를 동시에 여러개 조회 가능하게 한다.
SELECT EMPNO,JOB FROM EMP WHERE EMPNO > 1005;
--(오류): 조회하려는 컬럼의 갯수가 동일해야한다.
--UNION ALL 과 그냥 UNION 의 차이
--UNION만 중복된 데이터 제거한다!!!
SELECT * FROM EMP WHERE EMPNO <= 1005
UNION ALL -- 조회된 데이터를 동시에 여러개 조회 가능하게 한다.
SELECT * FROM EMP WHERE EMPNO >= 1005;
--INSERT의 다른 문법(INSERT + SELECT)
SELECT 10 + 10 FROM DUAL;//20
SELECT 1, ' 제목', '내용' , SYSDATE FROM DUAL;
// 1 제목 내용 22/08/17
--예시
CREATE TABLE CAR(
CAR_NUMBER NUMBER PRIMARY KEY
, MODEL_NAME VARCHAR2(100)
, MODEL_COLOR VARCHAR2(100)
);
INSERT INTO CAR (CAR_NUMBER, MODEL_NAME, MODEL_COLOR)
SELECT 1,'아반떼','검정' FROM DUAL;
SELECT * FROM CAR;
INSERT INTO CAR (CAR_NUMBER, MODEL_NAME, MODEL_COLOR)
SELECT 2,'아반떼','검정' FROM DUAL-- 원래는 VALUES() 가 들어가야하지만 SELECT 문을 바로 사용해줬다.
UNION ALL-- 한번에 2행이 삽입된다.
SELECT 3,'소나타','흰색' FROM DUAL;
SELECT * FROM CAR;
--이미지파일 여러개 넣기
INSERT INTO ITEM_IMAGE( IMG_CODE, ORIGIN_NAME, ATTACHED_NAME, IS_MAIN, ITEM_CODE )
SELECT 'IMG_005','a.jpg','a_1.jpg','Y','ITEM_001' FROM DUAL
UNION ALL
SELECT 'IMG_006','b.jpg','b_1.jpg','N','ITEM_001' FROM DUAL;
SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1, 3, 0) FROM ITEM_IMAGE;
SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1+1, 3, 0) FROM ITEM_IMAGE;
SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1+2, 3, 0) FROM ITEM_IMAGE;
DELETE ITEM_IMAGE;
DELETE SHOP_ITEM;
--상품목록조회(조인사용)
SELECT ITEM.ITEM_CODE
, ITEM_NAME
, ITEM_PRICE
, ATTACHED_NAME
FROM SHOP_ITEM ITEM ,ITEM_IMAGE IMG
WHERE ITEM.ITEM_CODE = IMG.ITEM_CODE
AND IS_MAIN = 'Y'
ORDER BY ITEM.ITEM_CODE DESC;
실습내용
(예시)
- emp사원테이블에서 체크한 사원만 삭제(1,3,5)
WHERE EMPNO = 1 OR EMPNO = 3 OR EMPNO = 5;
- 다른 방법 IN() 연산자 사용
DELETE EMP WHERE EMPNO IN(1,3,5);
package dto;
public class ItemDTO {
private String itemCode;
private String itemName;
private int itemPrice;
private String itemComment;
private int itemStock;
private String cateCode;
private String attachedName;//호출하려면 작성해줘야한다.GETTER,SETTER필요함
public String getItemCode() {
return itemCode;
}
public void setItemCode(String itemCode) {
this.itemCode = itemCode;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public int getItemPrice() {
return itemPrice;
}
public void setItemPrice(int itemPrice) {
this.itemPrice = itemPrice;
}
public String getItemComment() {
return itemComment;
}
public void setItemComment(String itemComment) {
this.itemComment = itemComment;
}
public int getItemStock() {
return itemStock;
}
public void setItemStock(int itemStock) {
this.itemStock = itemStock;
}
public String getCateCode() {
return cateCode;
}
public void setCateCode(String cateCode) {
this.cateCode = cateCode;
}
public String getAttachedName() {
return attachedName;
}
public void setAttachedName(String attachedName) {
this.attachedName = attachedName;
}
}
imgDTO
private List<ImgDTO> imgList;
-> 추가작성하기
package dto;
import java.util.List;
public class ImgDTO {
private String imgCode;
private String originName;
private String attachedName;
private String isMain;
private String itemCode;
private List<ImgDTO> imgList;
public String getAttachedName() {
return attachedName;
}
public void setAttachedName(String attachedName) {
this.attachedName = attachedName;
}
public List<ImgDTO> getImgList() {
return imgList;
}
public void setImgList(List<ImgDTO> imgList) {
this.imgList = imgList;
}
public String getImgCode() {
return imgCode;
}
public void setImgCode(String imgCode) {
this.imgCode = imgCode;
}
public String getOriginName() {
return originName;
}
public void setOriginName(String originName) {
this.originName = originName;
}
public String getAttachedname() {
return attachedName;
}
public void setAttachedname(String attachedname) {
this.attachedName = attachedname;
}
public String getIsMain() {
return isMain;
}
public void setIsMain(String isMain) {
this.isMain = isMain;
}
public String getItemCode() {
return itemCode;
}
public void setItemCode(String itemCode) {
this.itemCode = itemCode;
}
}
<?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">
<!-- 해당 파일에 모든 쿼리문을 작성 -->
<mapper namespace="itemMapper">
<resultMap type="dto.CategoryDTO" id="category">
<id column="CATE_CODE" property="cateCode"/>
<result column="CATE_NAME" property="cateName"/>
</resultMap>
<resultMap type="dto.ItemDTO" id="item">
<id column="ITEM_CODE" property="itemCode"/>
<result column="ITEM_NAME" property="itemName"/>
<result column="ITEM_PRICE" property="itemPrice"/>
<result column="ITEM_COMMENT" property="itemComment"/>
<result column="ITEM_STOCK" property="itemStock"/>
<result column="CATE_CODE" property="cateCode"/>
<result column="ATTACHED_NAME" property="attachedName"/>
</resultMap>
<select id="selectCategoryList" resultMap="category">
SELECT CATE_CODE
, CATE_NAME
FROM ITEM_CATEGORY
</select>
<insert id="insertItem">
INSERT INTO SHOP_ITEM (
ITEM_CODE
, ITEM_NAME
, ITEM_PRICE
, ITEM_COMMENT
, CATE_CODE
) VALUES (
#{itemCode}
, #{itemName}
, #{itemPrice}
, #{itemComment}
, #{cateCode}
)
</insert>
<!-- 상품목록조회 -->
<select id="selectItemList" resultMap="item">
SELECT ITEM.ITEM_CODE
, ITEM_NAME
, ITEM_PRICE
, ATTACHED_NAME
FROM SHOP_ITEM ITEM,ITEM_IMAGE IMG
WHERE ITEM.ITEM_CODE = IMG.ITEM_CODE
AND IS_MAIN = 'Y'
ORDER BY ITEM.ITEM_CODE DESC
</select>
<!-- item_image 테이블 상품등록하기위해서 -->
<!-- 이미지를 여러개 첨부파일해야하기때문에 반복문이 필요하다!!! -->
<!--
이 쿼리를 만들기 위해 반복을 사용시 어떻게 해야하는가?
DELETE EMP
WHERE EMPNO IN(1,3,5);
DELETE EMP
WHERE EMPNO IN 135 - item까지 속성사용할 시! 이렇게 나오기때문에 틀린문법이다.
open,close 는 처음과 끝 반복하기 전에 최초로 한 번만 사용된다.
separator 반목할 때 마다 한번씩
index 는 i라는 임의변수로 1씩 증가하는 음이 아닌 정수를 의미한다.0부터 시작 1,2,3,....
<foreach collection="empnoList" item="empno" open="(" close=")" separator="," index="i">
#{empno} +#{i}
</foreach> -->
<!-- 조회할 데이터들은 모두 imgDTO 에 담겨있다
imgCode 는 직접 받아오는 것이 아니라 1씩 자동증가 하는 서브쿼리문으로 들어간다-->
<!-- 원래 insert 기본 쿼리문
INSERT INTO ITEM_IMAGE (
IMG_CODE
, ORIGIN_NAME
, ATTACHED_NAME
, IS_MAIN
, ITEM_CODE
) VALUES (
(SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1, 3, 0) FROM ITEM_IMAGE)
, #{originName}
, #{attachedName}
, #{isMain}
, #{itemCode}
) -->
<insert id="insertImage">
INSERT INTO ITEM_IMAGE(
IMG_CODE
, ORIGIN_NAME
, ATTACHED_NAME
, IS_MAIN
, ITEM_CODE
)
<foreach collection="imgList" item="img" separator="UNION ALL" index="i">
SELECT (SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1 + #{i}, 3, 0) FROM ITEM_IMAGE)
, #{img.originName}
, #{img.attachedName}
, #{img.isMain}
, #{img.itemCode}
FROM DUAL
</foreach>
</insert>
<!-- 다음에 들어갈 item_code 조회
select 한 데이터는 우리가 실제로 자바로 가져와야한다.
우리가 작성한 쿼리를 데이터베이스에서 실행을 해야하는데
실행을 하면, 다음에 들어갈 아이템코드 하나만 들어간다!!!
그러면 자바로 따지면 문자 데이터 한 개와 같다!!
그래서 string으로 담아오면된느데 이럴 때는 resultMap 이 아니라 resultType으로 가져오면된다!!! -->
<select id="selectNextItemCode" resultType="String">
SELECT 'ITEM_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(ITEM_CODE, 6))), 0) + 1, 3, 0)
FROM SHOP_ITEM
</select>
<!-- 상품 상세 정보 조회 -->
<select id="selectDetailItem" resultMap="item">
SELECT ITEM.ITEM_CODE
, ITEM_NAME
, ITEM_COMMENT
, ITEM_PRICE
, ATTACHED_NAME
FROM SHOP_ITEM ITEM,ITEM_IMAGE IMG
WHERE ITEM.ITEM_CODE = #{itemCode}
AND ITEM.ITEM_CODE = IMG.ITEM_CODE
AND IS_MAIN = 'Y'
</select>
</mapper>
package service;
import java.util.List;
import dto.CategoryDTO;
import dto.ImgDTO;
import dto.ItemDTO;
public interface ItemService {
//카테고리 목록 조회
List<CategoryDTO> selectCategoryList();
//상품 등록 + 상품이미지 등록
void insertItem(ItemDTO itemDTO,ImgDTO imgDTO);
//상품 목록 조회
List<ItemDTO> selectItemList();
//다음에 들어갈 아이템코드 조회
String selectNextItemCode();
//이미지 정보 등록
void insertImage(ImgDTO imgDTO);
//상세조회
ItemDTO selectDetailItem(String itemCode);
}
package service;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import dto.CategoryDTO;
import dto.ImgDTO;
import dto.ItemDTO;
import sqlmap.SqlSessionManager;
public class ItemServiceImpl implements ItemService{
//쿼리 실행하는 객체
SqlSessionFactory sqlSessionFactory = SqlSessionManager.getSqlSession();
SqlSession sqlSession = sqlSessionFactory.openSession();
@Override
public List<CategoryDTO> selectCategoryList() {
List<CategoryDTO> list = sqlSession.selectList("itemMapper.selectCategoryList");
sqlSession.commit();
return list;
}
@Override
public void insertItem(ItemDTO itemDTO) {
sqlSession.insert("itemMapper.insertItem", itemDTO);
sqlSession.commit();
}
@Override
public List<ItemDTO> selectItemList() {
List<ItemDTO> list = sqlSession.selectList("itemMapper.selectItemList");
sqlSession.commit();
return list;
}
@Override
public String selectNextItemCode() {
String nextItemCode = sqlSession.selectOne("itemMapper.selectNextItemCode");
sqlSession.commit();
return nextItemCode;
}
@Override
public void insertImage(ImgDTO imgDTO) {
sqlSession.insert("itemMapper.insertImage",imgDTO);
sqlSession.commit();
}
@Override
public ItemDTO selectDetailItem(String itemCode) {
ItemDTO result = sqlSession.selectOne("itemMapper.selectDetailItem", itemCode);
sqlSession.commit();
return result;
}
}
package controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import dto.CategoryDTO;
import dto.ImgDTO;
import dto.ItemDTO;
import dto.MemberDTO;
import service.ItemService;
import service.ItemServiceImpl;
import service.MemberService;
import service.MemberServiceImpl;
@WebServlet("*.ad")
public class AdminController extends HttpServlet {
private static final long serialVersionUID = 1L;
private ItemService itemService = new ItemServiceImpl();
public AdminController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//한글 인코딩 처리
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String requestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String command = requestURI.substring(contextPath.length());
System.out.println("command = " + command);
String page = "jsp/template/admin_template.jsp";
boolean isRediect = false;
String contentPage = "";
//상품 등록 페이지로 이동
if(command.equals("/regItemForm.ad")) {
//카테고리 목록 조회
List<CategoryDTO> categoryList = itemService.selectCategoryList();
request.setAttribute("categoryList", categoryList);
contentPage = "admin/reg_item_form.jsp";
}
//상품 등록
else if(command.equals("/insertItem.ad")) {
// 기존 방식대로 데이터를 못받아온다.
// 왜?
// form태그에 enctype="multipart/form-data" 추가했기 때문에!!!
// String cateCode = request.getParameter("cateCode");
// String itemName = request.getParameter("itemName");
// int itemPrice = Integer.parseInt(request.getParameter("itemPrice"));
// String itemComment = request.getParameter("itemComment");
//파일 업로드 및 전달된 데이터를 받기 위해 Multipart 객체 생성
String uploadPath = "D:\\wockspaceHTML\\Shop_Teacher\\src\\main\\webapp\\images";//임의로 지정가능(이미지파일로)
int uploadSize = 10 * 1024 * 1024; //10메가바이트
//[객체생성 생성자 호출]
//실제 파일 업로드 및 전달된 데이터를 받는 객체
//첨부파일 있을 때는 무조건 반드시 작성해야한다!!!!
MultipartRequest multi = new MultipartRequest(
request//데이터 요청
,uploadPath//파일저장경로
,uploadSize//업로드시 사이즈 위 작성한 대로
,"UTF-8"//인코딩
, new DefaultFileRenamePolicy()//자바에서 파일 중복될 경우,기본파일명재정의정책대로
);
//모든 이미지 정보를 저장하여 쿼리 실행 시 빈값을 채워줄 객체
List<ImgDTO> imgList = new ArrayList<>();
//request -> (위에서 정의한)multi 로 변경
String cateCode = multi.getParameter("cateCode");
String itemName = multi.getParameter("itemName");
int itemPrice = Integer.parseInt(multi.getParameter("itemPrice"));
String itemComment = multi.getParameter("itemComment");
ItemDTO itemDTO = new ItemDTO();
itemDTO.setCateCode(cateCode);
itemDTO.setItemName(itemName);
itemDTO.setItemPrice(itemPrice);
itemDTO.setItemComment(itemComment);
//두 테이블에 공통적으로 들어갈 item_code를 같은 값으로 들어가야하게 만들어야 한다!!!!
//이미 자동으로 1씩 증가하게 만드는 조회 쿼리문을 매퍼에서 지난번 만들었기 때문에 주의해야한다.
//두가지 방식 중 중간에 조회쿼리를 만들어 사용하는 것을 이용할 것이다.
//insert되는 ITEM_CODE 를 조회
String nextItemCode = itemService.selectNextItemCode();
itemDTO.setItemCode(nextItemCode);// 이제부터는 itemDTO에 위에 정의한 nextItemCode 값이 빈값에 채워지도록 만들어준다.
//이전에 미리 맵퍼로 다시 가서 select 서브쿼리문이 아닌 #{itemCode} 값으로 value값을 변경해줘야한다!!
//그다음 우리가 할 것은?
//① SHOP_ITEM 상품정보 테이블에 데이터를 INSERT
// itemService.insertItem(itemDTO);
//② item_image 상품이미지 테이블에 데이터를 INSERT
//첨부한 파일명, 첨부된 파일명, isMain, itemCode 데이터 받기.
//첨부파일이 있는 input 태그의 name 속성값들을 가져온다.
Enumeration<String> inputNames = multi.getFileNames();//첨부된 파일이름들을 가져와서 데이터 받아사용한다.받아사용하려면 리턴타입사용해야한다.모르면 마우스올려서 알아본다.
//첨부파일이 갯수만큼 반복되는 while문!!!
while(inputNames.hasMoreElements()) {
//실제로 첨부파일이 있는 input 태그
String inputName = inputNames.nextElement();//하나식 빼서 알아보자.
//모르면 출력문으로 알아본다.
//뭔지모르니 a로 지정 후, run 해보니 실제 첨부된 파일의 input 태그의 name 속성값(a)이 출력이 된다.
// System.out.println( 111 + a );
// 111subFile
// 111mainFile
//원본 파일명
String originName = multi.getOriginalFileName(inputName);//실제 첨부된 원본네임을 가져온다.
//실제 파일을 첨부했을 때만...
if(originName != null) {
//실제로 등록된 파일명
String attachedName = multi.getFilesystemName(inputName);//서버에 등록된네임을 가져온다.
//출력문으로 확인하기.
// System.out.println("첨부한 파일: " + originName);
// System.out.println("첨부된 파일: " + attachedName);
//상품의 대표 1개 이미지로 할 것이 main이미지이면 y 아니면 n 으로한다/삼항연산자
String isMain = inputName.equals("mainImg")? "Y" : "N";
ImgDTO imgDTO = new ImgDTO();
imgDTO.setOriginName(originName);
imgDTO.setAttachedname(attachedName);
imgDTO.setIsMain(isMain);
imgDTO.setItemCode(nextItemCode);
imgList.add(imgDTO);//imgList에 위에서 받은 dto값들 모두 넣어준다.
}
}
ImgDTO img = new ImgDTO();
img.setImgList(imgList);
//① SHOP_ITEM 상품정보 테이블에 데이터를 INSERT
itemService.insertItem(itemDTO,img);//알아서 상품이미지등록 + 상품정보 모두 등록해주는 메소드 이용
//상품 이미지 등록(반복문안에 있어야한다)
// itemService.insertImage(img); //맵퍼에서 쿼리실행 안에 있는 빈값들 채워주기.위에서!
page = "regItemForm.ad";
isRediect = true;
}
request.setAttribute("contentPage", contentPage);
if(isRediect) {
response.sendRedirect(page);
}
else {
RequestDispatcher dispatcher = request.getRequestDispatcher(page);
dispatcher.forward(request, response);
}
}
}
package controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.ibatis.session.SqlSession;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import dto.ItemDTO;
import dto.MemberDTO;
import service.ItemService;
import service.ItemServiceImpl;
import service.MemberService;
import service.MemberServiceImpl;
@WebServlet("*.it")
public class ItemController extends HttpServlet {
private static final long serialVersionUID = 1L;
private ItemService itemService = new ItemServiceImpl();
public ItemController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//한글 인코딩 처리
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String requestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String command = requestURI.substring(contextPath.length());
System.out.println("command = " + command);
String page = "jsp/template/template.jsp";
boolean isRediect = false;
String contentPage = "";
//상품 목록 페이지
if(command.equals("/itemList.it")) {
contentPage = "item/item_list.jsp";
//List<ItemDTO> list = itemService.selectItemList();
///request.setAttribute("itemList", list);
request.setAttribute("itemList", itemService.selectItemList());
}
//상품상세보기
else if(command.equals("/itemDetail.it")) {
// String uploadPath = "D:\\wockspaceHTML\\Shop_Teacher\\src\\main\\webapp\\images";//임의로 지정가능(이미지파일로)
// int uploadSize = 10 * 1024 * 1024; //10메가바이트
// MultipartRequest multi = new MultipartRequest(
// request//데이터 요청
// ,uploadPath//파일저장경로
// ,uploadSize//업로드시 사이즈 위 작성한 대로
// ,"UTF-8"//인코딩
// , new DefaultFileRenamePolicy()//자바에서 파일 중복될 경우,기본파일명재정의정책대로
// );
String itemCode = request.getParameter("itemCode");
ItemDTO itemDTO = itemService.selectDetailItem(itemCode);
request.setAttribute("item", itemDTO);
contentPage = "item/item_detail.jsp";
}
request.setAttribute("contentPage", contentPage);
if(isRediect) {
response.sendRedirect(page);
}
else {
RequestDispatcher dispatcher = request.getRequestDispatcher(page);
dispatcher.forward(request, response);
}
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
.itemList-container{
width: 100%;
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
}
.itemDiv{
flex-basis: 20%;
text-align: center;
margin-bottom: 30px;
height: 310px;
font-size: 20px;
}
.itemDiv img:hover {
/* 투명도 */
opacity: 0.7;
}
</style>
</head>
<body>
<div class="itemList-container">
<c:forEach var="item" items="${itemList}">
<div class="itemDiv">
<div>
<a href='itemDetail.it?itemCode=${item.itemCode}'>
<img width="200px" height="260px" src="images/${item.attachedName}">
</a>
</div>
<div>${item.itemName}</div>
<div>${item.itemPrice}</div>
</div>
</c:forEach>
</div>
</body>
</html>
-item_detail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
.detailContainer{
width: 100%;
display: inline-block;
background-color: #EAE3D2;
text-align: center;
margin: 0 auto;
}
.imageDiv{
display: inline-block;
border: 1px solid black;
width: 500px;
height: 300px;
}
.itemDetailDiv{
display: inline-block;
text-align: left;
}
.container,.commentDiv,.addDiv{
background-color: white;
width: 100%
}
.commentDiv{
margin-top:30px;
margin-bottom:30px;
border-bottom: 1px solid black;
border-top: 1px solid black;
padding: 15px;
text-align: center;
}
</style>
</head>
<body>
<form action="itemDetail.it" method="post">
<input type="hidden" value="${item.itemCode}">
<div class="detailContainer">
<div class="imageDiv">
<img width="200px" height="260px" src="images/${item.attachedName }">
</div>
<div class="itemDetailDiv">
<div>${item.itemName}</div>
<div>가격</div>
<div>${item.itemPrice}</div>
<div>수량 : </div>
<div><input type="number" name="itemStock"></div>
<div>총 가격</div>
<div>${item.itemPrice*item.itemStock}</div>
<div>
<div class="btnDiv">
<input type="button" value="구매하기" onclick="">
<input type="button" value="장바구니" onclick="">
</div>
</div>
</div>
</div>
<div class="commentDiv">상품설명</div>
<div class="addDiv"><img src=""></div>
</form>
</body>
</html>
뷰(view)
- 의미) 두 테이블이 마치 하나로 이루어진 것같은 가상테이블
- 문제점) select 할 때 빈번한 조인과 서브쿼리의 사용은 프로그램 개발에서 엄청난 피로감을 느낌.
- 해결) 빈번한 조인,서브쿼리를 한 번만 사용해서 다음부터는 조인 및 서브쿼리를 사용하지 않아도
마치 사용한 것처럼 쿼리의 결과를 조회할 수 있는 기능
GRANT CREATE VIEW TO MYDB;
- 기본 조인 쿼리문
SELECT EMPNO,ENAME,SAL,EMP.DEPTNO,DNAME,LOC
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
- 뷰사용 쿼리문
CREATE VIEW MY_EMP AS
SELECT EMPNO,ENAME,SAL,EMP.DEPTNO,DNAME,LOC
FROM EMP,DEPT
WHERE EMP.DEPTNO =DEPT.DEPTNO;
- EMP 테이블 모두 조회
select * from MY_EMP;
결과: 조인한 결과와 같은 결과가 나온다.