반응형
2024_0711_Mybatis_SubQuery(실습 예제 파일)
기존에는 두 개의 테이블을 사용하려면, 두개의 xml을 사용해야 했다.
허나, 하나의 xml로 두 개의 테이블을 deptMap을 사용해서 사용할 수 있다.
일단은 Servlet을 작성하자
package action;
import java.io.IOException;
import java.util.List;
import dao.DeptDao;
import db.vo.DeptVo;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
/**
* Servlet implementation class DeptListAction
*/
@WebServlet("/dept/list.do")
public class DeptListAction extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 부서목록 읽어오기
List<DeptVo> list = DeptDao.getInstance().selectList();
// request binding
request.setAttribute("list",list);
// Dispatcher형식으로 호출
String forward_page = "dept_list.jsp";
RequestDispatcher disp = request.getRequestDispatcher(forward_page);
disp.forward(request, response);
}
}
deptVo Dao 작성하기
package dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import db.vo.DeptVo;
import service.MyBatisConnector;
public class DeptDao {
// Mybatis 객체
SqlSessionFactory factory;
// single-ton pattern : 객체 1개만 생성해서 이용하자
static DeptDao single = null;
public static DeptDao getInstance() {
//없으면 생성해라
if (single == null)
single = new DeptDao();
return single;
}
// 외부에서 객체생성하지 말아라...
private DeptDao() {
factory = MyBatisConnector.getInstance().getSqlSessionFactory();
}
public List<DeptVo> selectList() {
List<DeptVo> list = null;
// 1. SqlSession 얻어오기
SqlSession sqlSession = factory.openSession(); // Connection 획득
// 2. 작업수행 namespace
list = sqlSession.selectList("dept.dept_list");
// 3. 닫기 : conn.close()과정 포함
sqlSession.close();
return list;
}
}
SawonVo 생성~~
package db.vo;
import java.util.List;
public class SawonVo {
int sabun;
String saname;
String sasex;
int deptno;
String sajob;
String sahire;
int samgr;
int sapay;
List<GogekVo> go_list;
public List<GogekVo> getGo_list() {
return go_list;
}
public void setGo_list(List<GogekVo> go_list) {
this.go_list = go_list;
}
public int getSabun() {
return sabun;
}
public void setSabun(int sabun) {
this.sabun = sabun;
}
public String getSaname() {
return saname;
}
public void setSaname(String saname) {
this.saname = saname;
}
public String getSasex() {
return sasex;
}
public void setSasex(String sasex) {
this.sasex = sasex;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getSajob() {
return sajob;
}
public void setSajob(String sajob) {
this.sajob = sajob;
}
public String getSahire() {
return sahire;
}
public void setSahire(String sahire) {
this.sahire = sahire;
}
public int getSamgr() {
return samgr;
}
public void setSamgr(int samgr) {
this.samgr = samgr;
}
public int getSapay() {
return sapay;
}
public void setSapay(int sapay) {
this.sapay = sapay;
}
}
dept_list.jsp
<%@ 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>
</head>
<body>
<hr>
부서별 사원목록=>사원별 고객목록
<hr>
<ul>
<!-- for(DeptVo dept : list) -->
<c:forEach var="dept" items="${ requestScope.list }">
<li>
${ dept.deptno } : ${ dept.dname }
<ul>
<!-- for(SawonVo sawon : dept.sa_list) -->
<c:forEach var="sawon" items="${ dept.sa_list }">
<li>${ sawon.sabun } : ${ sawon.saname }</li>
<ul>
<c:forEach var="gogek" items="${ sawon.go_list }">
<li>${ gogek.gobun } : ${ gogek.goname }</li>
</c:forEach>
</ul>
</c:forEach>
</ul>
</li>
</c:forEach>
</ul>
</body>
</html>
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">
<!-- 데이터베이스 컬럼명 deptno를 no라는 변수명으로 지정해준다. -->
<!-- 이 과정은 컬럼명과 변수가 동일하지 않을경우에 지정해준다. -->
<!-- vo는 vo 대로 받아오고, map은 레이블 한 줄을 고대로 가져온다. -->
<!-- <result property="no" column="deptno"/> -->
<!-- 레코드 1개 포장시 적용 -->
<resultMap type="db.vo.DeptVo" id="deptMap">
<!-- property는 vo에서 지정한 변수명 -->
<result property="deptno" column="deptno"/>
<collection property="sa_list"
column="no=deptno"
select="dept.sawon_list_deptno"
/>
</resultMap>
<resultMap type="db.vo.SawonVo" id="sawonMap">
<result property="sabun" column="sabun"/>
<collection property="go_list"
column="{sabun=sabun}"
select="gogek_list_godam"
/>
</resultMap>
<select id="gogek_list_godam" resultType="db.vo.GogekVo">
select * from gogek where godam = #{ sabun }
</select>
<!-- parameterType을 안쓰는이유는 외부에서 가져오지 않고 xml 위에서 호출되었기에 사용안함 -->
<select id="sawon_list_deptno" resultMap="sawonMap">
select * from sawon where deptno = #{ no }
</select>
<select id="dept_list" resultMap="deptMap">
select * from dept
</select>
</mapper>
column parameter 중복적용도 가능하다 column="{a1=a1,a2=a2}"
gogek까지 연결해보자
진행방식은 숫자를 참고한다.
gogek column명 확인!~!
gogekVo 생성~~
package db.vo;
public class GogekVo {
int gobun;
String goname;
String goaddr;
String gojumin;
int godam;
public int getGobun() {
return gobun;
}
public void setGobun(int gobun) {
this.gobun = gobun;
}
public String getGoname() {
return goname;
}
public void setGoname(String goname) {
this.goname = goname;
}
public String getGoaddr() {
return goaddr;
}
public void setGoaddr(String goaddr) {
this.goaddr = goaddr;
}
public String getGojumin() {
return gojumin;
}
public void setGojumin(String gojumin) {
this.gojumin = gojumin;
}
public int getGodam() {
return godam;
}
public void setGodam(int godam) {
this.godam = godam;
}
}
SawonVo에 GogekVo ArrayList를 확보하고 추가~~ 그럼 밑작업은 끝났다.
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">
<!-- 데이터베이스 컬럼명 deptno를 no라는 변수명으로 지정해준다. -->
<!-- 이 과정은 컬럼명과 변수가 동일하지 않을경우에 지정해준다. -->
<!-- vo는 vo 대로 받아오고, map은 레이블 한 줄을 고대로 가져온다. -->
<!-- <result property="no" column="deptno"/> -->
<!-- 레코드 1개 포장시 적용 -->
<resultMap type="db.vo.DeptVo" id="deptMap">
<!-- property는 vo에서 지정한 변수명 -->
<result property="deptno" column="deptno"/>
<collection property="sa_list"
column="no=deptno"
select="dept.sawon_list_deptno"
/>
</resultMap>
<resultMap type="db.vo.SawonVo" id="sawonMap">
<result property="sabun" column="sabun"/>
<collection property="go_list"
column="{sabun=sabun}"
select="gogek_list_godam"
/>
</resultMap>
<select id="gogek_list_godam" resultType="db.vo.GogekVo">
select * from gogek where godam = #{ sabun }
</select>
<!-- parameterType을 안쓰는이유는 외부에서 가져오지 않고 xml 위에서 호출되었기에 사용안함 -->
<select id="sawon_list_deptno" resultMap="sawonMap">
select * from sawon where deptno = #{ no }
</select>
<select id="dept_list" resultMap="deptMap">
select * from dept
</select>
</mapper>
반응형
'데이터베이스↗' 카테고리의 다른 글
게시판 페이징 처리 (1) | 2024.07.12 |
---|---|
페이징 처리 (0) | 2024.07.12 |
Mybatis 검색기능 Search (0) | 2024.07.11 |
Mybatis library 설정과 사용 (0) | 2024.07.10 |
json kakao open api 활용하기 (0) | 2024.07.09 |