Mybatis Double Table deptMap

메타플랫폼대표
|2024. 7. 11. 18:09
반응형

2024_0711_Mybatis_SubQuery(실습 예제 파일)

 

GitHub - chaSunil/FirstProject: 1차 프로젝트

1차 프로젝트. Contribute to chaSunil/FirstProject development by creating an account on GitHub.

github.com

 

 

 

기존에는 두 개의 테이블을 사용하려면, 두개의 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