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;
JSP 세션 처리하기 & 구현 (0) | 2022.08.29 |
---|---|
JSP 이미지 갤러리 (0) | 2022.08.26 |
JSP 세션 트래킹 ( 쿠키 실습 - 쇼핑몰 장바구니 ) (0) | 2022.08.25 |
JSP 파일 업로드 (0) | 2022.08.25 |
JSP ( JSON 형식 동영상 플레이 리스트 ) (0) | 2022.08.25 |