상세 컨텐츠

본문 제목

JSP (Mybatis 사원sawon, 고객gogaek, Dept)

FrontEnd/JSP (JavaServerPage)

by H_Develop 2022. 8. 29. 18:34

본문

Mybatis와 같은 프레임 워크를 ORM(Object Relationship Mapper)라고 한다.

(관계형 데이터베이스, 프로그래밍을 좀 더 쉽게 할 수 있게 도와주는 개발 프레임 워크)

 

MybatisEx 프로젝트 생성

context.xml > username= "scott" password= "tiger"

 

vo package 생성 > Sawon.Vo 클래스 생성

 

package vo;
public class SawonVo {	// getter/setter 추가
	int sabun, deptno, sapay, samgr;
    String saname, sagene, sajop, sahire;
}

 

 

Java Resources > service package 생성 > MybatisConnector.java 생성

 

package service;

import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisConnector {
	SqlSessionFactory factory = null;
    private static MyBatisConnector connector;
    
    public MyBatisConnector() {
    	try {
        	Reader reader = Resources.getResourceAsReader("config/mybatis/sqlMapConfig.xml");
            factory = new SqlSessionFactoryBuilder().build(reader);
            reader.close();
        }	catch (IOException e) {
        	e.printStackTrace();
        }
    }
    public static MyBatisConnector getInsetance() {	// single ton
    	if(connector == null)
        	connector = new MyBatisConnector();
        return connector;
    }
    public SqlSessionFactory getSqlSessionFactory(){
    	return factory;
    }
}

 

context.xml 

name = "jdbc/oracle_test"

sqlMapConfig.xml

value = "java:comp/env/jdbc/oracle_test"

두 파일의 jdbc/oracle_test를 맞춰줘야 한다.

 

 

src > config.mybatis.mapper > sawon.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="sawon">
	<select id="sawon_list" resultType="vo.SawonVo">
    	select * from sawon
    </select>
    <delete id="sawon_delete" parameterType="int">
    	delete form sawon where sabun=#{sabun}
    </delete>
</mapper>

 

 

SawonDao.java 클래스

list=sqlSession.selectList("sawon.sawon_list");

// sawon.xml에 sawon을 써주었기에 이렇게 쓴다 주의할 것

 

package dao;

import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import service.MyBatisConnector;
import vo.SawonVo;

public class SawonDao {
	static SawonDao single = null;
    SqlSessionFactory factory;	// SessionFactory 객체 생성
    
    public SawonDao() {
    	super();
        public static SawonDao getInstance() {
        	if(single == null) {single = new SawonDao();}
            return single;
        }
    }
    public List<SawonVo> select() {
    	List<SawonVo> list = null;
        SqlSession sqlSession = factory.openSession();
        list = sqlSession.selectList("sawon.sawon_list");
        // sawon.xml에 sawon을 써주었기에 이렇게 쓴다.
        sqlSession.close();
        return list;
    }
}

 

 

src > action > SawonListAction 서블릿

 

package action;

import java.io.IOException;
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 vo.SawonVo;
import dao.SawonDao;

@WebServlet("/SawonListAction")
public class SawonListAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
    protected void service(HttpServletRequest request, HttpServletResponse response)
    	throws ServletException, IOException {
    	request.setCharacterEncoding("UTF-8");
        
        // 목록 가져오기
        List<SawonVo> list = SawonDao.getinsetance().select();
        request.setAttribute("list", list);
        RequestDispatcher disp = request.getRequestDispatcher("sawon_list.jsp");
        disp.forward(request, response);
	}
}

 

sawon folder 생성 > sawon_list.jsp (변수명은 오라클에 있는 컬럼명에 맞춰줘야한다.)

 

conn hr/rootoor

select * from sawon;

SABUN SANAME SAGENE DEPTNO SAJOB SAHIRE SAMGR SAPAY
컬럼 확인

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
	<table border="1" align="center">
    	<caption>:: 사원목록 ::</caption>
        <tr>
        	<th>사번</th>
        	<th>이름</th>
        	<th>성별</th>
        	<th>부서 번호</th>
        	<th>직책</th>
        	<th>입사일</th>
        	<th>상사 번호</th>
        	<th>연봉</th>
        </tr>
        <c:if test="${!empty requestScope.list}">
        	<c:forEach var="vo" items="${list}">
            	<tr>
                	<td>${vo.sabun}</td>
                	<td>${vo.saname}</td>
                	<td>${vo.sagene}</td>
                	<td>${vo.deptno}</td>
                	<td>${vo.sajob}</td>
                	<td>${fn:split(vo.sahire, ' ')[0]}</td>
                	<td>${vo.samgr}</td>
                	<td>${vo.sapay}</td>
                </tr>
            </c:forEach>
        <c:if>
    </table>
</body>
</html>

 

 

sawon_list_action 실행, 안나옴. (sawon.xml resultType 주의하기. 고치니까 나온다.)

localhost:8080/MybatisEx/sawon/sawonlist.do

 

 

 

sqlMapConfig.xml

파일에 고객정보 보기 gogaek추가해주기

 

<mappers>
	<mapper resource="config/mybatis/mapper/sawon.xml" />
    <mapper resource="config/mybatis/mapper/gogaek.xml" />
</mappers>

 

config.mybatis.mapper > gogaek.xml 파일 생성

<mapper namespace="gogaek"> 고객 넣었기 때문에

고객 DAO에서 list=sqlSession.selectList("gogaek.gogaek_list");이렇게 들어간다.

 

<?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="gogaek">
	<select id="gogaek_list" resultType="vo.GogaekVo">	<!-- 고객 vo 클래스 만들기 -->
    	select * from gogaek
    </select>
</mapper>

 

 

GogaekVo 클래스 생성

 

select * from gogaek;

GOBUN GONAME GOADD GOJUMIN GODAM
DB 확인

 

package vo;
public class GogaekVo {	// getter/setter 추가
	int gobun, godam;
    String goname, goadd, gojumin;
}

 

 

GogaekDao클래스 생성

 

package dao;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import vo.GogaekVo;

public class GogaekDao {
	static GogaekDao single = null;
    public static GogaekDao getInstance() {
    	if(single == null) {single = new GogaekDao();}
        return single;
    }
    // SessionFactory를 생성하는 객체
    SqlSessionFactory factory;
    
    public GogaekDao() {
    	super();
        factory = MyBatisConnector.getInstance().getSqlSessionFactory();
    }
    // 고객 목록 가져오기
    public List<GogaekVo> select() {
    	List<GogaekVo> list = null;
        SqlSession sqlSession = factory.openSession();
        list = sqlSession.selectList("gogaek.gogaek_list");
        sqlSession.close();
        return list;
    }
}

 

GogaekListAction 서블릿 생성

 

package actioin;
import java.io.IOException;
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 dao.GogaekDao;
import vo.GogaekVo;

@WebServlet("/gogaek/gogaeklist.do")
public class GogaekListAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
    protected void service(HttpServletRequest request, HttpServletResponse response)
    	throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
        // 목록 가져오기
        List<GogaekVo> list = GogaekDao.getInstance().select();
        request.setAttribute("list",list);
        RequestDispatcher disp = request.getRequestDispatcher("gogaek_list.jsp");
        disp.forward(request, response);
	}
}

 

gogaek folder 생성 > gogaek_list.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" %>
<!DOCTYPE html>
<%@ taglib prefix="c" uri=""http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
	<table border="1" align="center">
    	<caption>:: 고객 목록 ::</caption>
        <tr>
        	<th>고객 번호</th>
            <th>담당자</th>
            <th>이름</th>
            <th>주소</th>
            <th>주민 번호</th>
        </tr>
        <!-- 검색결과가 있다면 내용 출력 -->
		<c:if test="${!empty requestScope.list}">
	        <c:forEach var="vo" items="${list}">
				<tr>
                	<td>${vo.gobun}</td>
                	<td>${vo.godam}</td>
                	<td>${vo.goname}</td>
                	<td>${vo.goadd}</td>
                	<td>${vo.gojumin}</td>
                </tr>
    		<c:forEach>
		<c:if>
    </table>
</body>
</html>

 

 

GogaekListAction 실행

 

 

 

 

 

파라미터 변수이용 부서검색. (파라미터 변수로 조작하기 위해 ex) 20살 이상)

 

sawon.xml (파라미터 타입이 int) - 내용추가

 

<select id="sawon_list_deptno" resultType="vo.SawonVo" parameterType="int">
	select * from sawon where deptno = #{deptno}
</select>

 

sawon_list.jsp - 내용추가

 

<script>
	function find() {
    	// 선택된 값을 가져와서 sawonlist.do로 넘긴다 0 ~ 40
        var deptno = document.getElementById("deptno").value;
        location.href = "sawonlist.do?deptno=" + deptno;
    }	// find()
</script>
<body>
	<div align="center">
		부서 번호 :
        <select id="deptno">
        	<option value="0">:: 부서를 선택하세요 ::</option>
            <option value="10">총무부</option>
            <option value="20">영업부</option>
            <option value="30">전산부</option>
            <option value="40">관리부</option>
            <option value="50">경리부</option>
        </select>
        <input type="button" value="검색" onclick="find();">
	</div>
    <hr>

 

sawon_list_action - 내용추가

 

request.setCharacterEncoding("UTF-8"); // 사이 추가

int deptno = 0;
	String str_deptno = request.getParameter("deptno");
    //	정상적으로 값이 들어온 경우
    if(str_deptno != null && !str_deptno.isEmpty()) {
		deptno = Integer.parseInt(str_deptno);
	}
    // 목록 가져오기
    List<SawonVo> list = null;
    if(deptno == 0) {
    // 전체 조회
    	list = SawonDao.getInstance().select();
    }	else {
    // 부서별 조회
    	list = SawonDao.getInstance().select(deptno);
    }
// List<SawonVo> list = SawonDao.getInstance().select(); 주석 처리할 것

 

SawonDao - 내용추가 sawon_list_action에 select(int deptno)추가되었기 때문에 인자값 받는 select()가 필요

 

public List<SawonVo> select(int deptno) {
	List<SawonVo> list = null;
    SqlSession sqlSession = factory.openSession();
    list = sqlSession.selectList("sawon.sawon_list_deptno", deptno);
    sqlSession.close();
    return list;
}

 

SawonListAction 실행

 

 

 

 

gogaek.xml

 

<!-- 지역별 조회, 다음을 추가한다 -->
<select id="gogaek_list_search" resultType="vo.GogaekVo" parameterType="String">
	select * from gogaek where goadd like '%' || #{my_param} || '%'
</select>

'%' || #{my_param} || '%'

'%' + #{파라미터로 받을 임의의 이름} + '%'

쿼리문은 + 대신 ||을 사용하여 문자열을 결합한다.

 

 

gogaek_list.jsp

search(), 바디아래 <input id="search"> 추가

 

<script>
	function search() {
    	var search = document.getElementById("search").value.trim();
        if(search == '') {
        // search 값이 비어있으면 gogaeklist.do?search = 이렇만 넘어가므로,
        // gogaeklist.do?search=all로 넘어갈 수 있도록 해준다.
			search = 'all';
		}
        location.href = "gogaeklist.do?search =" + search;
    }
</script>
<body>
	<div align="center">
    	지역 : <input id = "search">
        <input type="button" value="검색" onclick="search();">
    </div>
</body>

 

 

GogaekListAction 서블릿 - 수정

 

package actioin;

import java.io.IOException;
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 dao.GogaekDao;
import vo.GogaekVo;

@WebServlet("/gogaek/gogaeklist.do")
public class GogaekListAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
    protected void service(HttpServletRequest request, HttpServletResponse response)
    	throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
        
        String search = "all";
        String str_goadd = request.getParameter("search");
        // 정상적으로 값이 들어온 경우
        if(str_goadd != null && str_goadd.isEmpty()) {
        	search = str_goadd;
        }
        
        // 목록 가져오기
        List<gogaekVo> list = null;
        if(search.equalsIgnoreCase("all")) {
        	// 전체 목록 보기
            list = GogaekDao.getInstance().select();
        }	else {
        	// 지역 검색 보기
            list = GogaekDao.getInstance().select(search);
        }
		request.setAttribute("list",list);
        
        RequestDispatcher disp = request.getRequestDispatcher("gogaek_list.jsp");
        disp.forward(request, response);
	}
}

 

 

GogaekDao - select(String search) 추가

 

public List<GogaekVo> select(String search) {
	List<GogaekVo> list = null;
    
    SqlSession sqlSession = factory.openSession();
    
    list = sqlSession.selectList("gogaek.gogaek_list_search", search);
    sqlSession.close();
    return list;
}

 

 

GogaekListAction 서블릿 실행

지역별 검색 가능

 

 

 

 

sqlMapConfig.xml

 

<mappers>
	<mapper resource="config/mybatis/mapper/sawon.xml" />
	<mapper resource="config/mybatis/mapper/gogaek.xml" />
	<mapper resource="config/mybatis/mapper/dept.xml" />
</mappers>

 

 

config.mybatis.mapper > dept.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="dept">
    <resultMap id="deptResult" type="vo.Dept.Vo">
        <result property="deptno" column="deptno" />
        <result property="dname" column="dname" />
        <result property="loc" column="loc" />

    <!-- <collectioin>은 자바의 컬렉션 객체(map, set, arraylist 등...)을 의미하는데,
        기본적으로 List형태를 갖는다. -->

        <collection property="sa_list"		// vo.DeptVo 안에 sa_list라는 이름의 list를 만든다.
                    column="{aaa=deptno}"	// deptno 컬럼을 aaa라는 이름으로 임시 저장. aaa는 그냥 막쓴거
                    select="sawon_list_deptno" />
    </ resultMap>

    <!-- dept 테이블에서 부서번호, 부서명, 위치를 검색한다. -->
    <select id="dept_list" resultMap="deptResult">
        select deptno, dname, loc from dept
    </select>

    <!-- 특정 부서번호에 해당하는 사원들의 번호, 이름을 검색한다. -->
    <select id="sawon_list_deptno" resultType="vo.SawonVo">
        select sabun, saname from sawon where deptno=#{aaa}
    </select>
</mapper>

 

 

DeptVo 클래스 생성

 

public class DeptVo {	// getter/setter
	int deptno;
    String dname, loc;
    List<SawonVo> sa_list;
}

 

 

 

DeptDao 클래스 생성

 

package dao;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import service.MyBatisConnector;
import vo.DeptVo;

public class DeptDao {
	static DeptDao single = null;
    public static DeptDao getInstance() {
    	if(single == null) {single = new DeptDao();}
        return single;
    }
    
    SqlSessioinFactory factory;
    
    public DeptDao() {
    	super();
        factory = MyBatisConnector.getInstance().getSqlSessionFactory();
    }
    
    // 부서목록 출력하기
    public List<DeptVo> select() {
    	List<DeptVo> list = null;
        SqlSession sqlSession = factory.openSession();
        list = sqlSession.selectList("dept.dept_list");
        sqlSession.close();
        return list;
    }
}

 

 

action > DeptListAction 서블릿 생성

 

package action;

import java.io.IOException;
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 dao.DeptDao;
import vo.DeptVo;

@WebServlet("/dept/list.do")
public class DeptListAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
    protected void service(HttpServletRequest request, HttpServletResponse response)
    	throws ServletException, IOException {
    	request.setCharacterEncoding("utf-8");
        List<DeptVo> list = DeptDao.getInstance().select();
        // 부서명을 포함하여 부서별 사원까지 검색이 완료된 상태이다.
        request.setAttribute("list", list);	// 리퀘스트 스코프에 바인딩
        RequestDispatcher disp = request.getRequestDispatcher("dept_list.jsp");
        disp.forward(request, response);
    }
}

 

 

dept 폴더 만들기 > dept_list.jsp 생성

forEach는 문장에서 하나씩 뽑아오겠다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<!DOCTYPE html>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
	부서별 사원목록
    <hr>
    <ul>
    	<c:forEach var="dept" items="${list}">
        	<li>${dept.deptno} : ${dept.dname}
            	<ul>
                	<c:forEach var="sawon" items="${dept.sa_list}">
                    	<li>${sawon.sabun} : ${sawon.saname}</li>
                    </c:forEach>
            	</ul>
            </li>
        </c:forEach>
    </ul>
</body>
</html>

 

config.mybatis > sqlMapConfig.xml

 

<mapper resource="config/mybatis/mapper/sawon_gogaek.xml" />

 

config.mybatis.mapper > sawon_gogaek.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="sg">

<!-- 1. sawon 테이블에서 사원 명을 가지고 와서 sawonResult로 연결 -->
<select id="sawon_gogaek_list" resultMap="sawonResult">
	select * from sawon
</select>

<!-- 2. 1에서 요청한 쿼리를 수행한 후, 고객 리스트를 저장할 List 생성 -->
<resultMap id="sawonResult" type="vo.SawonVo">
    <result property="sabun" column="sabun" />
    <!-- <collection>은 자바의 컬렉션 객체(map, set, arraylist 등)을 의미하는데 기본적으로 List형태를 갖는다 -->
    <collection property="sa_gogaek_list" column="{sabun=sabun}" select="sawon_gogaek_list_deptno" />
</resultMap>

<!-- 3. 특정 사번에 해당하는 관리대상 고객 목록을 출력 -->
<select id="sawon_gogaek_list_deptno" resultType="vo.GogaekVo">
	select * from gogaek where godam=#{sabun}
</select>
</mapper>

 

 

SawonVo 클래스

 

List<GogaekVo> sa_gogaek_list;
// getter/setter 추가

 

 

SawonGogaekDao 클래스 생성

 

package dao;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import service.MyBatisConnector;
import vo.SawonVo;

public class SawonGogaekDao {
	static SawonGogaekDao single = null;
    
    public static SawonGogaekDao getInstance() {
    	if(single == null) {single = new SawonGogaekDao();}
        return single;
    }
    
    SqlSessionFactory factory;
    
    public SawonGogaeDao() [
    	super();
        factory = MyBatisConnector.getInstance().getSqlSessionFactory();
    }
    
    // 사원 목록 가져오기
    public List<SawonVo> select() {
    	List<SawonVo> list = null;
        SqlSession sqlSession = factory.openSession();
        list = sqlSession.selectList("sg.sawon_gogaek_list");
        sqlSession.close();
        return list;
    }
}

 

 

SawonGogaekListAction 서블릿 생성

 

package action;

import java.io.IOException;
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;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

관련글 더보기