국비지원학원/MyBatis

115일차-페이지 선택유지/dynamicQuery/procedure사용

초코맛 2019. 4. 19. 03:38
반응형

//값을 여러개 선택하여 검색하는 경우에는 hidden태그와 Param으로 전달받아 함께 검색해야 유지된다.

히든 과? Param으로 받아 삼항연산자 사용해야 동기로 값이 유지!
 
<<<car 조회>>>>
//car_mapper.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">
  <!-- Query문을 정의
     ns(namespace) : XML내에서 중복된 id를 사용할 수 있도록  구분하는 것.
                (패키지와 비슷한 용도)
  -->
<mapper namespace="kr.co.sist.car">
<!-- Car resultMap 설정 : setter method명이 컬럼명과 다른경우에  주의  -->
<resultMap type="kr.co.sist.exam.domain.CarModel"  id="carModelResult">
     <result column="car_img" property="carImg"/>
     <result column="maker" property="maker"/>
     <result column="model" property="model"/>
     <result column="car_year" property="carYear"/>
     <result column="price" property="price"/>
     <result column="car_option" property="carOption"/>
</resultMap>
<select id="selectCarCountry" resultType="String"  parameterType="String">
     select maker
     from car_country
     where country = #{ country }
</select>
<select id="selectCarMaker" resultType="String"  parameterType="String">
     select model
     from car_maker
     where maker = #{ maker }
</select>
<select id="selectCarModel" resultMap="carModelResult"  parameterType="String">
     select cmo.car_img, cma.maker, cmo.model, cmo.car_year,  cmo.price, cmo.car_option
     from car_maker cma, car_model cmo
     where (cmo.model = cma.model) and cmo.model = #{ model }
</select>
</mapper>
//CarModel.java
package kr.co.sist.exam.domain;
public class CarModel {
     private String carImg,maker,model,carYear,price,carOption;
     public String getCarImg() {
           return carImg;
     }
     public void setCarImg(String carImg) {
           this.carImg = carImg;
     }
     public String getMaker() {
           return maker;
     }
     public void setMaker(String maker) {
           this.maker = maker;
     }
     public String getModel() {
           return model;
     }
     public void setModel(String model) {
           this.model = model;
     }
     public String getCarYear() {
           return carYear;
     }
     public void setCarYear(String carYear) {
           this.carYear = carYear;
     }
     public String getPrice() {
           return price;
     }
     public void setPrice(String price) {
           this.price = price;
     }
     public String getCarOption() {
           return carOption;
     }
     public void setCarOption(String carOption) {
           this.carOption = carOption;
     }     
}
//CarDAO.java
package kr.co.sist.exam.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import kr.co.sist.exam.domain.CarModel;

public class CarDAO {
    public List<String> selectMaker(String country){
        List<String> list=null;
        //4.Handler얻기
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        
        list=ss.selectList("selectCarCountry", country);
        
        ss.close();
        return list;
    }//selectMaker
    
    public List<String> selectModel(String maker){
        List<String> list=null;
        //4.Handler얻기
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        
        list=ss.selectList("selectCarMaker", maker);
        
        ss.close();
        return list;
    }//selectModel
    
    public List<CarModel> selectDetailModel(String model){
        List<CarModel> list=null;
        //4.Handler얻기
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        
        list=ss.selectList("selectCarModel", model);
        
        ss.close();
        return list;
    }//selectDetailModel
    
    public static void main(String[] args) {
        CarDAO md=new CarDAO();
        //md.selectMaker("국산");
        //md.selectModel("BMW");
        md.selectDetailModel("아반테");
    }//main
    
}//class

//CarService.java
package kr.co.sist.exam.service;
import java.util.List;
import kr.co.sist.exam.dao.CarDAO;
import kr.co.sist.exam.domain.CarModel;
public class CarService {
     
     private CarDAO cd;
     public CarService() {
           cd=new CarDAO();
     }//CarService
     
     public List<String> searchMaker(String country){
           List<String> list=null;
           //CarDAO cd=new CarDAO();
           list=cd.selectMaker(country);
           return list;
     }//searchMaker
     
     public List<String> searchModel(String maker){
           List<String> list=null;
           list=cd.selectModel(maker);
           return list;
     }//searchModel
     
     public List<CarModel> searchDetailModel(String model){
           List<CarModel> list=null;
           list=cd.selectDetailModel(model);
           return list;
     }//searchDetailModel
     
}//class
//car.jsp
<%@page import="kr.co.sist.exam.domain.CarModel"%>
<%@page import="java.util.List"%>
<%@page import="kr.co.sist.exam.service.CarService"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
     String country=request.getParameter("car_country");
     String maker=request.getParameter("car_maker");
     String model=request.getParameter("car_model");
     String  selectFlag=request.getParameter("car_flag");//submit이 되는  <form>에서 어떤 폼 컨트롤이 이벤트를 발생시켰는지 식별하기 위해서  사용하는것
     CarService cs=new CarService();
     if("1".equals(selectFlag)){//제조국에서 이벤트가 발생 했을  때
           List<String> list=cs.searchMaker(country); //제조국에  따른 제조사를 조회
           pageContext.setAttribute("makerList", list);
     }//end if
     
     if("2".equals(selectFlag)){//제조사에서 이벤트가 발생 했을  때
           List<String> list=cs.searchMaker(country);
           pageContext.setAttribute("makerList", list);
           //제조사에 따른 모델명을 조회
           List<String> modelList=cs.searchModel(maker);
           pageContext.setAttribute("modelList", modelList);
     }//end if
     
     if("3".equals(selectFlag)){//모델에서 이벤트가 발생했을 때
           List<String> list=cs.searchMaker(country);
           pageContext.setAttribute("makerList", list);
           //제조사에 따른 모델명을 조회
           List<String> modelList=cs.searchModel(maker);
           pageContext.setAttribute("modelList", modelList);
           
           //모델에 따른 세부 차량 조회
           List<CarModel> carList=cs.searchDetailModel(model);
           pageContext.setAttribute("carList", carList);
           //동기식의 가장 큰 문제 여러번 붙여야 한다.
     }//end if
%>
<script type="text/javascript">
//CDN : Content delivery network 콘텐츠 전송 네트워크
$(function(){
     $("#car_country").change(function(){
           if($("#car_country").val() !="none"){
                $("#car_flag").val("1");
                $("#frm").submit();
           }//end if
     });//change
     $("#car_maker").change(function(){
           if($("#car_maker").val() !="none"){
                $("#car_flag").val("2");
                $("#frm").submit();
           }//end if
     });//change
     $("#car_model").change(function(){
           if($("#car_model").val() !="none"){
                $("#car_flag").val("3");
           }//end if
     });//change
     $("#btn").click(function(){
           if($("#car_flag").val()=="3"){
                $("#frm").submit();
           }//end if
     });//click
     
});//ready
</script>
<div id="carHeader" style="margin-top: 20px; ">
     <form name="frm" action="main.jsp" method="get" id="frm">
     <input type="hidden" name="page" value="day0410/car"/>
     <input type="hidden" name="car_flag" id="car_flag"/>
     <select name="car_country" id="car_country">
           <option value="none">----제조국----</option>
           <option value="국산"${param.car_country eq  '국산'?"selected='selected'":"" }>국산</option>
           <option value="수입"${param.car_country eq  '수입'?"selected='selected'":""}>수입</option>
     </select>
     <select name="car_maker" id="car_maker">
           <option value="none">----제조사----</option>
           <c:if test="${not empty makerList }">
           <c:forEach var="maker" items="${makerList}">
                <option value="${maker}"${param.car_maker eq  maker?"selected='selected'":"" }><c:out  value="${maker}"/></option>
           </c:forEach>
           </c:if>
     </select>
     <select name="car_model" id="car_model">
           <option value="none">----모델명----</option>
           <c:if test="${not empty modelList}">
           <c:forEach var="model" items="${modelList}">
                <option value="${model}"${param.car_model eq  model?"selected='selected'":"" }><c:out  value="${model}"/></option>
           </c:forEach>
           </c:if>
     </select>
     <input type="button" value="조회" id="btn" class="btn"/>
     </form>
</div><br/>
<div id="carSearchView">
<c:if test="${param.car_flag eq '3'}">
<table style="border-top: 2px solid #333; border-bottom: 1px  solid #333; ">
<tr>
     <th width="80" style="border-bottom: 1px solid  #333;">이미지</th>
     <th width="400" style="border-bottom: 1px solid  #333;">차량정보</th>
     <th width="150" style="border-bottom: 1px solid  #333;">연식</th>
</tr>
<c:if test="${empty carList}">
<tr>
     <td colspan="3" style="text-align: center">등록된 차량이  존재하지 않습니다.</td>
</tr>
</c:if>
<c:forEach var="car" items="${carList}">
<tr>
     <td><img  src="http://localhost:8080/mybatis_prj/day0409/images/${car.carImg}" style="width:80px; height: 50px"/></td>
     <td>
           <div>
           <c:out value="${car.maker}"/><c:out  value="${car.model}"/>
           </div>
           <div>
                <c:out value="${car.price}"/>만원
           </div>
           <div>
                <c:out value="${car.carOption}"/>
           </div>
     </td>
     <td>
           <c:out value="${car.carYear}"/>년식
     </td>
</tr>
</c:forEach>
</table>
</c:if>
</div>



//다이나믹은 vo

*dynamic Query
  • <if> )
    • 는 단일if -조건에 맞을때에만 쿼리를 실행해야 할 때.
  • <choose> )
    • 는 여러개의 조건을 비교할 때
    • 속성이 없고
    • <choose>
      • <when test="조건식">
        • 조건에 맞을때 실행될 쿼리문
      • </when>
      • ...반복
      • <otherwise>
        • 모든 조건이 맞지않을 때 실행될 쿼리문
      • </otherwise>
    • </choose>
//dynamic_choose.jsp
<%@page import="kr.co.sist.exam.domain.Dynamicif"%>
<%@page import="kr.co.sist.exam.vo.DeptnoVO"%>
<%@page import="kr.co.sist.exam.service.MyBatisService1"%>
<%@page import="kr.co.sist.exam.domain.Emp"%>
<%@page import="java.util.List"%>
<%@page import="kr.co.sist.exam.dao.MyBatisDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>
<%
     MyBatisService1 mbs=new MyBatisService1();
     String deptno=request.getParameter("deptno");
     
     if(deptno!=null){
           List<Dynamicif> list=mbs.dynamicChoose(new  DeptnoVO(Integer.parseInt(deptno)));
           pageContext.setAttribute("empList", list);
     }//end if
%>
<form name="frm" action="main.jsp">
<input type="hidden" name="page"  value="day0410/dynamic_choose"/>
<label>부서번호 입력</label>
<input type="text" name="deptno" class="inputBox"/>
<input type="submit" value="사원 조회" class="btn"/><br/>
*10~30번 부서의 사원을 조회. 없는 부서번호가 입력되면 모든  부서사원을 조회
</form>
<div>
<c:if test="${not empty param.deptno}">
     <div>
           ${param.deptno}번 부서 사원 조회 결과
     </div>
     <table border="1">
           <tr>
                <th width="40">번호</th>
                <th width="80">사원번호</th>
                <th width="120">사원명</th>
                <th width="80">직무</th>
                <th width="80">부서번호</th>
                <th width="150">입사일</th>
           </tr>
           <c:if test="${empty empList}">
           <tr>
                <td colspan="6" align="center">
                     입력하신 부서는 부서가 존재하지 않거나  사원이 없습니다.
                </td>
           </tr>
           </c:if>
           <c:forEach var="emp" items="${empList}">
           <c:set var="i" value="${i+1}"/>
           <tr>
                <td><c:out value="${i}"/></td>
                <td><c:out value="${emp.empno}"/></td>
                <td><c:out value="${emp.ename}"/></td>
                <td><c:out value="${emp.job}"/></td>
                <td><c:out value="${emp.deptno}"/></td>
                <td><c:out value="${emp.hiredate}"/></td>
           </tr>
           </c:forEach>
     </table>
</c:if>
</div>
  • <forEach> )
    • //는 속성이 위와 좀 다르다 => 반복!   (쿼리문이 동적일때 반복 시킬 일??=>있긴 있 ㅏㄷ...) 조건 검색..
    • 배열이나 List에 들어있는 값을 반복 시켜야 할 때
    • //where 회사명 in(,,,)
    • in <forEach collection="배열|List명" item="객체명" open="시작문자(" close="끝문자)" separator="값구문하는 문자">         
      • ${getter명}
    • </forEach>

ex)
select 컬럼명,,,
from 테이블명
where 컬럼명 in
<forEach open="(" 
    collection="List를 반환하는 getter명(nameList)" item="객체명" separator="," close=")">   //getNameList가 nameList에 들어온다.
#{}    ///객체명이 들어온다.
</forEach>

class Test{
private List<String> nameList;

public List<String> getNameList(){

}
//dynamic_foreach.jsp
<%@page import="kr.co.sist.exam.domain.Car"%>
<%@page import="java.util.List"%>
<%@page import="kr.co.sist.exam.service.MyBatisService1"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
     MyBatisService1 mbs =new MyBatisService1();
     List<Car> carList=mbs.joinSubquery();
     pageContext.setAttribute("carList", carList);
%>
<div>
<form action="main.jsp" method="get">
<input type="hidden" name="page"  value="day0410/dynamic_foreach"/>
     <c:set var="maker"  value="현대,기아,삼성,쌍용,BMW,BENZ,AUDI"/>
     제조사 선택 :
     <c:forTokens items="${maker}" delims="," var="maker">
           <input type="checkbox" name="maker"  value="${maker}"/>
           <c:out value="${maker}" escapeXml="false"/>
     </c:forTokens>
     <input type="submit" value="조회" class="btn"/>
</form>
</div>
<table style="border-top: 2px solid #333; border-bottom: 1px  solid #333; ">
<tr>
     <th width="80" style="border-bottom: 1px solid  #333;">이미지</th>
     <th width="400" style="border-bottom: 1px solid  #333;">차량정보</th>
     <th width="150" style="border-bottom: 1px solid  #333;">등록일</th>
</tr>
<c:if test="${empty carList}">
<tr>
     <td colspan="3" style="text-align: center">등록된 차량이  존재하지 않습니다.</td>
</tr>
</c:if>
<c:forEach var="car" items="${carList}">
<tr>
     <td><img  src="http://localhost:8080/mybatis_prj/day0409/images/${car.img}" style="width:80px; height: 50px"/></td>
     <td>
           <div>
           <c:out value="${car.maker}"/><c:out  value="${car.model}"/>
           </div>
           <div>
                <c:out value="${car.carYear}"/>년식 <c:out  value="${car.price}"/>
           </div>
           <div>
                <c:out value="${car.carOption}"/>
           </div>
     </td>
     <td>
           <c:out value="${car.hiredate}"/>
     </td>
</tr>
</c:forEach>
</table>
//CarVO.java
package kr.co.sist.exam.vo;
import java.util.List;
public class CarVO {
     private List<String> makerList;
     public CarVO(List<String> makerList) {
           this.makerList = makerList;
     }
     public List<String> getMakerList() {
           return makerList;
     }
     
}
//dynamic_foreach.jsp
<%@page import="kr.co.sist.exam.domain.Car"%>
<%@page import="java.util.List"%>
<%@page import="kr.co.sist.exam.service.MyBatisService1"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
     String[] makerArr=request.getParameterValues("maker");
     MyBatisService1 mbs =new MyBatisService1();
     List<Car> carList=mbs.dynamicForeach(makerArr);
     pageContext.setAttribute("carList", carList);
%>
<div style="margin-top: 20px">
<form action="main.jsp" method="get">
<input type="hidden" name="page"  value="day0410/dynamic_foreach"/>
     <c:set var="maker"  value="현대,기아,삼성,쌍용,BMW,BENZ,AUDI"/>
     제조사 선택 :
     <c:forTokens items="${maker}" delims="," var="maker">
           <input type="checkbox" name="maker"  value="${maker}"/>
           <c:out value="${maker}" escapeXml="false"/>
     </c:forTokens>
     <input type="submit" value="조회" class="btn"/>
</form>
</div>
<div style="margin-top: 20px">
<table style="border-top: 2px solid #333; border-bottom: 1px  solid #333; ">
<tr>
     <th width="80" style="border-bottom: 1px solid  #333;">이미지</th>
     <th width="400" style="border-bottom: 1px solid  #333;">차량정보</th>
     <th width="150" style="border-bottom: 1px solid  #333;">등록일</th>
</tr>
<c:if test="${empty carList}">
<tr>
     <td colspan="3" style="text-align: center">등록된 차량이  존재하지 않습니다.</td>
</tr>
</c:if>
<c:forEach var="car" items="${carList}">
<tr>
     <td><img  src="http://localhost:8080/mybatis_prj/day0409/images/${car.img}" style="width:80px; height: 50px"/></td>
     <td>
           <div>
           <c:out value="${car.maker}"/><c:out  value="${car.model}"/>
           </div>
           <div>
                <c:out value="${car.carYear}"/>년식 <c:out  value="${car.price}"/>
           </div>
           <div>
                <c:out value="${car.carOption}"/>
           </div>
     </td>
     <td>
           <c:out value="${car.hiredate}"/>
     </td>
</tr>
</c:forEach>
</table>
</div>


*procedure 사용

create or replace procedure 프로시저명{
   매개변수 in 데이터형, 매개변수 in 데이터형,
   매개변수 out 데이터형, 매개변수 out 데이터형)
is

begin

end;
/
--반환형이 없다! 대신 in/out 

create or replace procedure insertDept{
   deptno in number|dept.deptno%type, dname in varchar2,
   loc out varchar2, cnt out number)
is

begin
   :cnt=sql%rowCount;  --:cnt가 out 을 타고 나간다
end;
/

  • <select>노드를 가지고 호출한다.
  • <select id="" parameterType="VO(getter-입력되어 사용할 값과 저장할 값을 모두 가지고 있어야 함)" statementType="CALLABLE">
  • //VO는 int deptno, cnt, String dname, loc를 가져야 한다. 
  • {
  •    call 프로시저명(insertDept)(#{getter명, mode=IN} | OUT, jdbcType=DB에서 사용하는 데이터형, javaType="Java에서 저장할 데이터형}
  •    call insert_dept(#{deptno, mode=IN},
  •                             #{dname,mode=IN},
  •                             #{loc, mode=IN},
  •                             #{cnt,mode=out, jdbcType=NUMERIC, JavaType=int})
  • }
  • </select>
  • T VO tv=new TVO(10,"개발",서울,0);
  • SqlSession.selectOne("id", tv);//여러행을 반환해도 프로시져 호출해 List가 아니라 vo가 list를 가진다.
  • tv.getCnt() //추가된 함수 cnt parameter에 대한 값을 얻음.
 
//TestProcVO.java
package kr.co.sist.exam.vo;
/**
* Procedure에 사용되는 VO는 In Parameter 값과 Out Parameter 값을  모두 가지고 있어야 한다.
* @author owner
*/
public class TestProcVO {
     
     private int empno, sal, rowCnt;
     private String ename, job, msg;
     
     public TestProcVO(int empno, int sal, int rowCnt, String  ename, String job, String msg) {
           this.empno = empno;
           this.sal = sal;
           this.rowCnt = rowCnt;
           this.ename = ename;
           this.job = job;
           this.msg = msg;
     }
     
     public int getEmpno() {
           return empno;
     }
     public void setEmpno(int empno) {
           this.empno = empno;
     }
     public int getSal() {
           return sal;
     }
     public void setSal(int sal) {
           this.sal = sal;
     }
     public int getRowCnt() {
           return rowCnt;
     }
     public void setRowCnt(int rowCnt) {
           this.rowCnt = rowCnt;
     }
     public String getEname() {
           return ename;
     }
     public void setEname(String ename) {
           this.ename = ename;
     }
     public String getJob() {
           return job;
     }
     public void setJob(String job) {
           this.job = job;
     }
     public String getMsg() {
           return msg;
     }
     public void setMsg(String msg) {
           this.msg = msg;
     }
     
}//class
//insert_procedure.jsp
<%@page import="kr.co.sist.exam.vo.TestProcVO"%>
<%@page import="kr.co.sist.exam.domain.Car"%>
<%@page import="java.util.List"%>
<%@page import="kr.co.sist.exam.service.MyBatisService1"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
     String empno=request.getParameter("empno");
     String ename=request.getParameter("ename");
     String sal=request.getParameter("sal");
     String job=request.getParameter("job");
     if(empno!=null){
           MyBatisService1 mbs =new MyBatisService1();
           TestProcVO tp=new  TestProcVO(Integer.parseInt(empno),Integer.parseInt(sal),0,ename,job,"" );
           tp=mbs.insertProcedure(tp);
           pageContext.setAttribute("tp", tp);
     }//end if
%>
<div style="margin-top: 20px">
<form action="main.jsp" method="get">
<input type="hidden" name="page"  value="day0410/insert_procedure"/>
     사원번호 :
     <input type="text" name="empno" class="inputBox"/><br/>
     사원명 :
     <input type="text" name="ename" class="inputBox"/><br/>
     직급 :
     <input type="text" name="job" class="inputBox"/><br/>
     연봉 :
     <input type="text" name="sal" class="inputBox"/><br/>
     <input type="submit" value="사원추가" class="btn"/>
</form>
</div>
<div style="margin-top: 20px">
<c:if test="${not empty param.empno}">
     <c:out value="${tp.rowCnt}"/>건 수행 되었습니다.<br/>
     <c:out value="${tp.msg}"/>
</c:if>
</div>




//main_menu.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- smartmenu 시작 -->
   <!-- SmartMenus core CSS (required) -->
   <link  href="http://localhost:8080/mybatis_prj/common/smartmenu/css/sm-core-css.css" rel="stylesheet" type="text/css" />
   
   <!-- "sm-blue" menu theme (optional, you can use your own  CSS, too) -->
   <link  href="http://localhost:8080/mybatis_prj/common/smartmenu/css/sm-simple/sm-simple.css" rel="stylesheet" type="text/css" />
   
   <!-- jQuery -->
    <!-- <script  src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> -->
    <!-- SmartMenus jQuery plugin -->
    <script type="text/javascript"  src="http://localhost:8080/mybatis_prj/common/smartmenu/jquery.smartmenus.js"></script>
    <!-- SmartMenus jQuery init -->
    <script type="text/javascript">
       $(function() {
          $('#main-menu').smartmenus({
             subMenusSubOffsetX: 1,
             subMenusSubOffsetY: -8
          });
       });
    </script>
<!-- smartmenu 끝 -->
     <nav id="main-nav">
      <!-- Sample menu definition -->
      <ul id="main-menu" class="sm sm-simple">
        <li><a href="#void">홈으로</a></li>
        <li><a href="#void">쿼리 실행</a>
          <ul>
            <li><a href="#void">1일차</a>
              <ul>
                <li><a  href="main.jsp?page=day0404/single_column">컬럼하나에 레코드  하나</a></li>
                <li><a  href="main.jsp?page=day0404/multi_column">컬럼여러개에 레코드  하나</a></li>
                <li><a  href="main.jsp?page=day0404/multi_row">컬럼하나에 레코드  여러개</a></li>
              </ul>
            </li>
            <li><a href="#void">2일차</a>
              <ul>
                <li><a  href="main.jsp?page=day0405/multi_column_row">컬럼여러개에 레코드  여러개</a></li>
                <li><a  href="main.jsp?page=day0405/multi_param">where절의 값이  여러개</a></li>
                <li><a  href="main.jsp?page=day0405/lessthan">&lt; 의 비교</a></li>
                <li><a  href="main.jsp?page=day0405/greaterthan">&gt; 의 비교</a></li>
                <li><a  href="main.jsp?page=day0405/like">like</a></li>
              </ul>
            </li>
            <li><a href="#void">3일차</a>
              <ul>
                <li><a  href="main.jsp?page=day0408/subquery">subquery</a></li>
                <li><a  href="main.jsp?page=day0408/union">union</a></li>
                <li><a  href="main.jsp?page=day0408/join">join</a></li>
              </ul>
            </li>
            <li><a href="#void">4일차</a>
              <ul>
                <li><a  href="main.jsp?page=day0409/join_subquery">join+subquery</a></li>
                <li><a  href="main.jsp?page=day0409/dynamic_table">테이블명이 동적일  떄</a></li>
                <li><a  href="main.jsp?page=day0409/dynamic_if">dynamic if</a></li>
              </ul>
            </li>
            <li><a href="#void">5일차</a>
              <ul>
                <li><a  href="main.jsp?page=day0410/dynamic_choose">dynamic  choose</a></li>
                <li><a  href="main.jsp?page=day0410/dynamic_foreach">dynamic  foreach</a></li>
                <li><a  href="main.jsp?page=day0410/insert_procedure">insert  procedure</a></li>
              </ul>
            </li>
          </ul>
        </li>
        <li><a href="main.jsp?page=day0410/car">동기방식  차량조회</a></li>
        </ul>
     </nav>
        
        
//MyBatisDAO1.java
package kr.co.sist.exam.dao;

import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.session.SqlSession;

import kr.co.sist.exam.domain.Car;
import kr.co.sist.exam.domain.Demp;
import kr.co.sist.exam.domain.DiaryList;
import kr.co.sist.exam.domain.Dynamicif;
import kr.co.sist.exam.domain.Emp;
import kr.co.sist.exam.domain.EmpJoin;
import kr.co.sist.exam.domain.Union;
import kr.co.sist.exam.domain.Zipcode;
import kr.co.sist.exam.vo.CarVO;
import kr.co.sist.exam.vo.DeptnoVO;
import kr.co.sist.exam.vo.DiaryListParamVO;
import kr.co.sist.exam.vo.EmpVO;
import kr.co.sist.exam.vo.TestProcVO;
import kr.co.sist.exam.vo.TnameVO;

public class MyBatisDAO1 {
    public List<Emp> multiParam(EmpVO ev){
        List<Emp> list=null;
        //4.Handler얻기
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        
        list=ss.selectList("multiParam",ev);
        
        ss.close();
        
        return list;
    }//multiParam
    
    public List<Emp> lessThan(int sal){
        List<Emp> list=null;
        
        //4.
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        list=ss.selectList("lessThan",sal);
        ss.close();
        
        return list;
    }//lessThan
    
    public List<Emp> greaterThan(int sal){
        List<Emp> list=null;
        
        //4.
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        list=ss.selectList("greaterThan",sal);
        ss.close();
        
        return list;
    }//greaterThan
    
    public List<Zipcode> like(String dong){
        List<Zipcode> list=null;
        
        //4.
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        list=ss.selectList("like",dong);
        ss.close();
        
        return list;
    }//like
    
    public int diaryTotalCount() {
        int cnt=0;
        
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        cnt=ss.selectOne("diaryCnt");
        
        return cnt;
    }//diaryTotalCount
    
    public List<DiaryList> subquery(DiaryListParamVO dlpvo){
        List<DiaryList> list=null;
        
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        list=ss.selectList("subquery",dlpvo);
        
        return list;
    }//subquery
    
    public List<Union> union(){
        List<Union> list=null;
        
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        list=ss.selectList("union");
        
        return list;
    }//union
    
    public List<EmpJoin> join(int mgr){
        List<EmpJoin> list=null;
        
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        list=ss.selectList("join",mgr);
        
        return list;
    }//join

    public List<Car> joinSubquery(){
        List<Car> list=null;
        
        SqlSession ss= MyBatisDAO.getInstance().getSessionFactory().openSession();
        list=ss.selectList("joinSubquery");
        
        return list;
    }//joinSubquery
    
    public List<Demp> dynamicTable(TnameVO tvo){
        List<Demp> list=null;
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        list=ss.selectList("dtable",tvo);
        return list;        
    }//dynamicTable
    
    public List<Dynamicif> dynamicIf(DeptnoVO dvo){
        List<Dynamicif> list=null;
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        list=ss.selectList("dynamicif", dvo);
        return list;
    }//dynamicIf
    
    public List<Dynamicif> dynamicChoose(DeptnoVO dvo){
        List<Dynamicif> list=null;
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        list=ss.selectList("kr.co.sist.exam2.dynamicChoose", dvo);
        return list;
    }//dynamicIf
    
    public List<Car> dynamicForeach(CarVO cv){
        List<Car> list=null;
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        list=ss.selectList("kr.co.sist.exam2.dynamicForeach", cv);
        return list;
    }//dynamicForeach
    
    public TestProcVO insertProc(TestProcVO tpvo) {
        SqlSession ss=MyBatisDAO.getInstance().getSessionFactory().openSession();
        System.out.println("-----"+tpvo.getMsg());
        ss.selectOne("insertProcedure",tpvo);
        System.out.println("-----"+tpvo.getMsg());
        
        return tpvo;
    }//insertProc
    
    
    public static void main(String[] args) {
        MyBatisDAO1 md=new MyBatisDAO1();
        //md.multiParam(new EmpVO(30, "SALESMAN"));
        //md.lessThan(3000);
        //md.greaterThan(3000);
        //md.like("상도동");
        //md.diaryTotalCount();
        //md.union();
        //md.join(7698);
        //md.joinSubquery();
        //md.dynamicTable(new TnameVO("cp_emp2"));
        //md.dynamicIf(13);//Error
        //md.dynamicIf(new DeptnoVO(20));
        //md.dynamicChoose(new DeptnoVO(100));
        
        //List<String> list=null;
        /*list=new ArrayList<String>();
        list.add("현대");
        list.add("기아");
        list.add("BMW");
        list.add("삼성");*/
        //md.dynamicForeach(new CarVO(list));
        
        TestProcVO tpvo=new TestProcVO(1111, 3000, 0, "김희철", "대리", "");
        md.insertProc(tpvo);
        
        
    }//main
    
}//class

//MyBatisService1.java
package kr.co.sist.exam.service;

import java.util.ArrayList;
import java.util.List;

import kr.co.sist.exam.dao.MyBatisDAO1;
import kr.co.sist.exam.domain.Car;
import kr.co.sist.exam.domain.Demp;
import kr.co.sist.exam.domain.DiaryList;
import kr.co.sist.exam.domain.Dynamicif;
import kr.co.sist.exam.domain.Emp;
import kr.co.sist.exam.domain.EmpJoin;
import kr.co.sist.exam.domain.Union;
import kr.co.sist.exam.domain.Zipcode;
import kr.co.sist.exam.vo.CarVO;
import kr.co.sist.exam.vo.DeptnoVO;
import kr.co.sist.exam.vo.DiaryListParamVO;
import kr.co.sist.exam.vo.EmpVO;
import kr.co.sist.exam.vo.TestProcVO;
import kr.co.sist.exam.vo.TnameVO;

public class MyBatisService1 {
    public List<Emp> multiParam(EmpVO ev){
        List<Emp> list=null;
        MyBatisDAO1 mb_dao1=new MyBatisDAO1();
        
        list=mb_dao1.multiParam(ev);
        
        return list;
    }//multiParam
    
    public List<Emp> lessThan(int sal){
        List<Emp> list=null;
        
        if(sal<0) {
            sal=-sal;
        }//end if
        
        MyBatisDAO1 md_dao1=new MyBatisDAO1();
        list=md_dao1.lessThan(sal);
        
        return list;
    }//lessThan
    
    public List<Emp> greaterThan(int sal){
        List<Emp> list=null;
        
        if(sal > 10000) {
            sal=10000;
        }//end if
        
        MyBatisDAO1 md_dao1=new MyBatisDAO1();
        list=md_dao1.greaterThan(sal);
        
        return list;
    }//greaterThan
    
    public List<Zipcode> like(String dong){
        List<Zipcode> list=null;
        
        MyBatisDAO1 md_dao1=new MyBatisDAO1();
        list=md_dao1.like(dong);
        
        return list;
    }//like
    
    ////////////////////게시판의 리스트를 얻어오자//////////////////////////////////////
    //게시판의 총 갯수
    public int totalCount() {
        int cnt=0;
        MyBatisDAO1 mb_dao=new MyBatisDAO1();
        cnt=mb_dao.diaryTotalCount();
        return cnt;
    }//totalCount
    
    //한화면에 보여줄 게시물의 갯수
    public int pageScale() {
        return 10;
    }//pageScale
    
    //총 페이지 수
    public int totalPage(int totalCount, int pageScale) {
        int totalPage=0;
        totalPage=(int)Math.ceil((double)totalCount/pageScale);
        
        return totalPage;
    }//totalPage
    
    //시작번호
    public int startNum(String currentPage, int pageScale) {
        int startNum=1;
        
        if(currentPage !=null) {
            int tempPage=Integer.parseInt(currentPage);
            startNum =tempPage*pageScale-pageScale+1;
        }//end if
        return startNum;
    }//startNum

    //끝번호
    public int endNum(int startNum, int pageScale) {
        return startNum+pageScale-1;
    }//endNum
    
    public List<DiaryList> diaryList(DiaryListParamVO dlp_vo){
        List<DiaryList> list=null;
        
        MyBatisDAO1 mb_dao=new MyBatisDAO1();
        list=mb_dao.subquery(dlp_vo);
        
        return list;
    }//diaryList
    
    public List<Union> union(){
        List<Union> list=null;
        
        MyBatisDAO1 mb_dao=new MyBatisDAO1();
        list=mb_dao.union();
        
        return list;
    }//union
    
    public List<EmpJoin> join(int mgr){
        List<EmpJoin> list=null;

        MyBatisDAO1 mb_dao=new MyBatisDAO1();
        list=mb_dao.join(mgr);
        
        return list;
    }//join
    
    public List<Car> joinSubquery(){
        List<Car> list=null;
        
        MyBatisDAO1 mb_dao=new MyBatisDAO1();
        list=mb_dao.joinSubquery();
        //카 옵션이 25자 이상이라면 24자까지 보여주고 "..."으로 처리
        for(Car car:list) {
            if(car.getCarOption().length()>25) {
                car.setCarOption(car.getCarOption().substring(0, 24)+"...");
            }//end if
        }//end for
        
        return list;
    }//joinSubquery
    
    public List<Demp> dynamicTable(TnameVO tv){
        List<Demp> list=null;
        MyBatisDAO1 mb_dao=new MyBatisDAO1();
        list=mb_dao.dynamicTable(tv);
        return list;
    }//dynamicTable
    
    public List<Dynamicif> dynamicIf(DeptnoVO dv){
        List<Dynamicif> list=null;
        
        MyBatisDAO1 mb_dao=new MyBatisDAO1();
        list=mb_dao.dynamicIf(dv);
        
        return list;
    }//dynamicIf
    
    public List<Dynamicif> dynamicChoose(DeptnoVO dv){
        List<Dynamicif> list=null;
        
        MyBatisDAO1 mb_dao=new MyBatisDAO1();
        list=mb_dao.dynamicChoose(dv);
        
        return list;
    }//dynamicChoose
    
    public List<Car> dynamicForeach(String[] makerArr){
        List<Car> list=null;
        
        //입력되는 배열의 값이 존재한다면 리스트에 추가
        List<String> makerList=null;
        if(makerArr!=null) {
            makerList=new ArrayList<String>();
            for(String temp: makerArr) {
                makerList.add(temp);
            }//end for
        }//end if
        
        CarVO cv=new CarVO(makerList);
        
        MyBatisDAO1 mb_dao=new MyBatisDAO1();
        list=mb_dao.dynamicForeach(cv);
        
        return list;
    }//dynamicForeach
    
    public TestProcVO insertProcedure(TestProcVO tpvo) {
        MyBatisDAO1 mb_dao=new MyBatisDAO1();
        tpvo=mb_dao.insertProc(tpvo);
        return tpvo;
    }//insertProcedure
    
    
    
}//class

//exam_mapper2.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">
<mapper namespace="kr.co.sist.exam2">
<!-- Diary List에 대한 Mapper 설정 -->
<resultMap type="kr.co.sist.exam.domain.DiaryList"  id="dlResult">
     <result column="num" property="num"/>
     <result column="subject" property="subject"/>
     <result column="writer" property="writer"/>
     <result column="evt_date" property="evt_date"/>
     <result column="w_date" property="w_date"/>
</resultMap>
<!-- Union에서 사용되는 resultMap -->
<resultMap type="kr.co.sist.exam.domain.Union" id="unionResult">
     <result column="empno" property="empno"/>
     <result column="sal" property="sal"/>
     <result column="deptno" property="deptno"/>
     <result column="ename" property="ename"/>
     <result column="job" property="job"/>
     <result column="hiredate" property="hiredate"/>
     <result column="retired" property="retired"/>
</resultMap>
<!-- Join resultMap -->
<resultMap type="kr.co.sist.exam.domain.EmpJoin" id="empResult">
     <result column="empno" property="empno"/>
     <result column="ename" property="ename"/>
     <result column="sal" property="sal"/>
     <result column="hiredate" property="hiredate"/>
     <result column="deptno" property="deptno"/>
     <result column="dname" property="dname"/>
     <result column="loc" property="loc"/>
</resultMap>
<!-- Car resultMap: 컬럼명과 setter method명이 다른경우에  주의하여(명시에 주의) 사용!!!=>같게 만드는게 훨씬 편하다. -->
<resultMap type="kr.co.sist.exam.domain.Car" id="carResult">
     <result  column="car_img" property="img"/>
     <result  column="maker" property="maker"/>
     <result  column="model" property="model"/>
     <result  column="car_year" property="carYear"/>
     <result  column="price" property="price"/>
     <result  column="car_option" property="carOption"/>
</resultMap>
<select id="diaryCnt" resultType="int">
     select count(*) cnt from diary
</select>
<!-- subquery의 조회
      diary 테이블에서 가장 마지막 글에서 부터 시작번호와 끝번호  사이의 글을 조회
-->
<select id="subquery" resultMap="dlResult"  parameterType="kr.co.sist.exam.vo.DiaryListParamVO">
     select r_num,num,subject,writer,  e_year||'-'||e_month||'-'||e_day evt_date,
                to_char(w_date,'yyyy-mm-dd hh24:mi') w_date
     from (select num,subject,writer,e_year,e_month,e_day,  w_date, row_number() over(order by w_date desc) r_num
                from diary)
     where r_num between #{startNum} and #{endNum}
</select>
  
<!-- union의 조회 : 퇴사한 사원과 재직중인 사원을 구분하여 조회-->
<select id="union" resultMap="unionResult" >
     select empno,ename,job,sal,to_char(hiredate,'yyyy-mm-dd')  hiredate,deptno,retired    
     from union_test
     where retired='N'
     union all
     select empno,ename,job,sal,to_char(hiredate,'yyyy-mm-dd')  hiredate,deptno,retired    
     from union_test
     where retired='Y'
</select>
  
<!-- join의 조회 : 매니저 번호를 입력받아 매니저가 관리하는  사원들의 사원번호,사원명,연봉,입사일,부서번호,부서명,위치를 조회  -->
<select id="join" resultMap="empResult" parameterType="Integer">
     select  e.empno,e.ename,e.sal,e.hiredate,d.deptno,d.dname,d.loc
     from emp e, dept d
     where e.deptno=d.deptno and e.mgr=#{mgr}
</select>
<!-- join+subquery 의 조회
           차량이미지, 제조사, 모델명, 연식, 가격, 옵션을 조회  하세요.
           가장 마지막에 입력된 차량부터 10건만 조회.(무조건)
-->  
<select id="joinSubquery" resultMap="carResult">
     select car_img, maker,model, car_year, price, car_option,  to_char(hiredate,'yyyy-mm-dd hh24:mi') hiredate
     from (select car_img, maker,model, car_year, price,  car_option, hiredate,
                row_number() over(order by hiredate desc) r_num
                from (select   cmo.car_img,cma.maker,cmo.model,cmo.car_year,cmo.price,cmo.car_option,cmo.hiredate
                           from car_maker cma, car_model cmo
                           where cmo.model=cma.model))
     where r_num between 1 and 10
</select>
<!-- 컬럼명 또는 테이블명이 동적일 때의 조회
           //#은 사용할 수 없다
           반드시 parameterType이 VO라고 하고 ${getter}를  사용해야 한다.
           컬럼이 동일형으로 하나가 조회되는 경우에는 동적으로 사용  할 수 있으나
           컬럼이 여러개가 조회되는 경우에는 동적으로 사용하기  어렵다.
           
           테이블 명(EMP,CP_EMP2)이 외부에서 입력되고, 동일 컬럼이  조회되는 경우
           조회 컬럼 : EMPNO,ENAME,HIREDATE,SAL
           from 에 #이 들어가면 from ? 으로 인식하여 조회되지  않는다
-->  
<resultMap type="kr.co.sist.exam.domain.Demp" id="dynamicTable">
     <result column="empno" property="empno"/>
     <result column="ename" property="ename"/>
     <result column="hiredate" property="hiredate"/>
     <result column="sal" property="sal"/>
</resultMap>
<select id="dtable" resultMap="dynamicTable"  parameterType="kr.co.sist.exam.vo.TnameVO">
     select empno,ename,hiredate,sal
     from ${tname}
</select>
<!-- dynamic query -OGNL : where,if,choose,foreach 반드시 VO    
      if의 사용:
      EMP테이블에서 부서번호가 10~19사이면 10번부서사원 검색하고,
     20~29번 사이면 20번 부서 사원 검색하고, 30~39번 사이면 30번  부서 조회
     그렇지 않으면 전체 사원 조회
-->
<resultMap type="kr.co.sist.exam.domain.Dynamicif"  id="ifResult">
     <result column="empno" property="empno"/>
     <result column="deptno" property="deptno"/>
     <result column="ename" property="ename"/>
     <result column="job" property="job"/>
     <result column="hiredate" property="hiredate"/>
</resultMap>
<select id="dynamicif" resultMap="ifResult"  parameterType="kr.co.sist.exam.vo.DeptnoVO">
     select empno, ename, job, deptno,  to_char(hiredate,'yyyy-mm-dd') hiredate
     from emp
     <where>
           <if test="deptno &gt;= 10 and deptno &lt; 20">
                deptno=10
           </if>
           <if test="deptno &gt;= 20 and deptno &lt; 30">
                deptno=20
           </if>
           <if test="deptno &gt;= 30 and deptno &lt; 40">
                deptno=30
           </if>
     </where>
</select>
<!-- 숙제- 제조국|제조사|모델명 조회 -모델1 -->
<!-- dynamic choose :
           EMP테이블에서 부서번호가 10~19사이면 10번부서사원  검색하고,
     20~29번 사이면 20번 부서 사원 검색하고, 그렇지 않으면 30번  부서 조회
-->
<select id="dynamicChoose" resultMap="ifResult"  parameterType="kr.co.sist.exam.vo.DeptnoVO">
<!-- test??parameterType??에 들어가는건 반드시 getter -->
     select empno, ename, job, deptno,  to_char(hiredate,'yyyy-mm-dd') hiredate
     from emp
     <where>
     <choose>
           <when test="deptno &gt;=10 and deptno &lt; 20">
                deptno=10
           </when>
           <when test="deptno &gt;=20 and deptno &lt; 30">
                deptno=20
                <!-- deptno in(20,30)도 가능 -->
           </when>
           <otherwise>
                deptno=30
           </otherwise>    
     </choose>
     </where>
</select>
<!-- dynamic forEach :
           제조가사 조회되면 제조사별 차량을 조회
-->
<select id="dynamicForeach" resultMap="carResult"  parameterType="kr.co.sist.exam.vo.CarVO">
     select car_img, maker,model, car_year, price, car_option,  to_char(hiredate,'yyyy-mm-dd hh24:mi') hiredate
     from (select car_img, maker,model, car_year, price,  car_option, hiredate,
           row_number() over(order by hiredate desc) r_num
           from (select   cmo.car_img,cma.maker,cmo.model,cmo.car_year,cmo.price,cmo.car_option,cmo.hiredate
                from car_maker cma, car_model cmo
                where cmo.model=cma.model
                <if test="makerList != null">
                and cma.maker in
                <foreach collection="makerList" item="maker"  open="("
                                close=")" separator=",">
                     #{maker}
                </foreach>
                </if>
     ))
</select>
<!-- procedure 호출 -->  
  <!-- insert :  insert_test_proc(10000,'공선의',3000,'사원',:m,:c)
                프로시저를 호출할 때 in parameter 값과 out  parameter 값은 모두 VO 에 함께 들어가 있어야 한다.
                
                in parameter => #{getter, mode=IN}
                단일 데이터 형일 때
                out parameter => #{setter, mode=OUT, jdbcType= ,  javaType= }
  -->
  <select id="insertProcedure"  parameterType="kr.co.sist.exam.vo.TestProcVO"
    statementType="CALLABLE">
  {
     call insert_test_proc(#{empno, mode=IN}, #{ename,  mode=IN}, #{sal, mode=IN}, #{job, mode=IN},
                                     #{msg, mode=OUT,  jdbcType=VARCHAR, javaType=String},
                                     #{rowCnt, mode=OUT,  jdbcType=NUMERIC, javaType=int}
                                 )
  }
  </select>
  
  <!-- cursor -->
  
</mapper>

 

반응형

'국비지원학원 > MyBatis' 카테고리의 다른 글

116일차-Procedure사용  (0) 2019.04.20
114일차-Dynamic Query조회  (0) 2019.04.19
113일차-지도 마무리/조회 마무리  (0) 2019.04.19
112일차-MyBatis  (0) 2019.04.17
111일차-MyBatis  (0) 2019.04.17