본문 바로가기

학원/복기

[Mybatis] discriminator 엘리먼트

[MYHEWON 테이블] 생성

create table myhewon(hewon_id varchar2(50) primary key, hewon_name varchar2(50)
    , hewon_phone varchar2(20), hewon_email varchar2(100), hewon_status number(1));

 

MYHEWON 테이블 : 회원정보를 저장하기 위한 테이블

 

 

[MyHewon] DTO 클래스 선언

 

공개범위에 어떤 값이 저장되어있느냐에 따라 사용자에게 공개되는 정보가 달라지게 만들어 볼것이다.

package xyz.itwill.dto;

/*
이름           널?       유형            
------------ -------- ------------- 
HEWON_ID     NOT NULL VARCHAR2(50)  - 아이디
HEWON_NAME            VARCHAR2(50)  - 이름
HEWON_PHONE           VARCHAR2(20)  - 전화번호
HEWON_EMAIL           VARCHAR2(100) - 이메일
HEWON_STATUS          NUMBER(1)     - 공개범위

공개범위 : 1(아이디), 2(아이디&이름), 3(아이디&이름&전화번호), 4(아이디&이름&전화번호&이메일)
*/

public class MyHewon {
	private String id;
	private String name;
	private String phone;
	private String email;
	private int status;
	
	public MyHewon() {
		// TODO Auto-generated constructor stub
	}

	public MyHewon(String id, String name, String phone, String email, int status) {
		super();
		this.id = id;
		this.name = name;
		this.phone = phone;
		this.email = email;
		this.status = status;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}
}

 

매퍼 파일 생성

 

 

xml 매퍼 파일

[MyHewonMapper.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xyz.itwill.mapper.MyHewonMapper">
	<insert id="insertHewon" parameterType="MyHewon">
		insert into myhewon values(#{id}, #{name}, #{phone}, #{email}, #{status})
	</insert>
	
	<resultMap type="MyHewon" id="myHewonReultMap">
		<id column="hewon_id" property="id"/>
		<result column="hewon_name" property="name"/>
		<result column="hewon_phone" property="phone"/>
		<result column="hewon_email" property="email"/>
		<result column="hewon_status" property="status"/>
	</resultMap>
	
	<select id="selectHewonList" resultMap="myHewonReultMap">
		select hewon_id, hewon_name, hewon_phone, hewon_email, hewon_status from myhewon order by hewon_id
	</select>
</mapper>

 

인터페이스 매퍼 파일

[MyHewonMapper]

package xyz.itwill.mapper;

import java.util.List;

import xyz.itwill.dto.MyHewon;

public interface MyHewonMapper {
	int insertHewon(MyHewon hewon);
	List<MyHewon> selectHewonList();
}

 

DAO 생성

[MyHewonDAO]

package xyz.itwill.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import xyz.itwill.dto.MyHewon;
import xyz.itwill.mapper.MyHewonMapper;

public class MyHewonDAO extends AbstractSession {
	private static MyHewonDAO _dao;

	private MyHewonDAO() {
		// TODO Auto-generated constructor stub
	}
	
	static {
		_dao=new MyHewonDAO();
	}
	
	public static MyHewonDAO getDAO() {
		return _dao;
	}
	
	public int insertHewon(MyHewon hewon) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyHewonMapper.class).insertHewon(hewon);
		} finally {
			sqlSession.close();
		}
	}
	
	public List<MyHewon> selectHewonList() {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyHewonMapper.class).selectHewonList();
		} finally {
			sqlSession.close();
		}
	}
}

 

JSP 

[hewonInsert.jsp]

회원정보 삽입

<%@page import="xyz.itwill.dto.MyHewon"%>
<%@page import="xyz.itwill.dao.MyHewonDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	MyHewonDAO.getDAO().insertHewon(new MyHewon("aaa", "홍길동", "010-1234-5678", "aaa@itwill.xyz", 1));
	MyHewonDAO.getDAO().insertHewon(new MyHewon("bbb", "임꺽정", "010-4764-3411", "bbb@itwill.xyz", 2));
	MyHewonDAO.getDAO().insertHewon(new MyHewon("ccc", "전우치", "010-7825-2159", "ccc@itwill.xyz", 3));
	MyHewonDAO.getDAO().insertHewon(new MyHewon("ddd", "일지매", "010-9124-7821", "ddd@itwill.xyz", 4));
	MyHewonDAO.getDAO().insertHewon(new MyHewon("eee", "장길산", "010-4551-4454", "eee@itwill.xyz", 3));
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
</head>
<body>
	<h1>회원등록</h1>
	<hr>
	<h3>회원정보가 성공적으로 삽입 되었습니다.</h3>
</body>
</html>

 

[hewonListSelect.jsp]

회원정보 출력 

<%@page import="xyz.itwill.dto.MyHewon"%>
<%@page import="xyz.itwill.dao.MyHewonDAO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	List<MyHewon> hewonList=MyHewonDAO.getDAO().selectHewonList();
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
<style type="text/css">
table {
	border: 1px solid black;
	border-collapse: collapse;
}

td {
	border: 1px solid black;
	text-align: center;
	padding: 3px;
}

.id { width: 150px; }
.name { width: 150px; }
.phone { width: 200px; }
.email { width: 200px; }
.status { width: 100px; }
</style>
</head>
<body>
	<h1>회원목록</h1>
	<hr>
	<table>
		<tr>
			<td class="id">아이디</td>
			<td class="name">이름</td>
			<td class="phone">전화번호</td>
			<td class="email">이메일</td>
			<td class="status">공개범위</td>
		</tr>
		<% if(hewonList.isEmpty()) { %>
			<tr>
				<td colspan="5">검색된 회원정보가 없습니다.</td>
			</tr>
		<% } else { %>
			<% for(MyHewon hewon : hewonList) { %>
			<tr>
				<td><%=hewon.getId() %></td>
				<td><%=hewon.getName() %></td>
				<td><%=hewon.getPhone() %></td>
				<td><%=hewon.getEmail() %></td>
				<td><%=hewon.getStatus() %></td>
			</tr>
			<% } %>
		<% } %>
	</table>
</body>
</html>

 


discriminator 

 

discriminator 엘리먼트 이용해 select 하기

 

discriminator : 검색행의 컬럼값을 비교하여 매핑정보를 다르게 제공하기 위한 엘리먼트

→ 하위 엘리먼트로 case 엘리먼트를 사용한다. case 엘리먼트로 검색행의 컬럼값을 비교하여 매핑정보를 제공한다.

 

 - javaType 속성 : 검색행의 비교 컬럼값에 대한  Java 자료형을 속성값으로 설정한다.

     Java 자료형 대신 typeAlias 엘리먼트로 제공된 별칭을 사용할 수 있다.

 - column 속성 : 검색행에서 비교할 컬럼명을 속성값으로 설정한다.

 

xml매퍼

	<resultMap type="MyHewon" id="myHewonDiscriminatorResultMap">
		<discriminator javaType="int" column="hewon_status">
			<case value="1">
				<id column="hewon_id" property="id"/>
				<result column="hewon_status" property="status"/>
			</case>
			<case value="2">
				<id column="hewon_id" property="id"/>
				<result column="hewon_name" property="name"/>
				<result column="hewon_status" property="status"/>
			</case>
			<case value="3">
				<id column="hewon_id" property="id"/>
				<result column="hewon_name" property="name"/>
				<result column="hewon_phone" property="phone"/>
				<result column="hewon_status" property="status"/>
			</case>
			<case value="4">
				<id column="hewon_id" property="id"/>
				<result column="hewon_name" property="name"/>
				<result column="hewon_phone" property="phone"/>
				<result column="hewon_email" property="email"/>
				<result column="hewon_status" property="status"/>
			</case>
		</discriminator>
	</resultMap>
	
	<select id="selectDiscriminatorHewonList" resultMap="myHewonDiscriminatorResultMap">
		select hewon_id, hewon_name, hewon_phone, hewon_email, hewon_status from myhewon order by hewon_id
	</select>

인터페이스 매퍼

public interface MyHewonMapper {
	int insertHewon(MyHewon hewon);
	List<MyHewon> selectHewonList();
	List<MyHewon> selectDiscriminatorHewonList();
}

DAO 

	public List<MyHewon> selectHewonList() {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyHewonMapper.class).selectHewonList();
		} finally {
			sqlSession.close();
		}
	}

JSP

[hewonListDiscriminatorSelect.jsp]

<%@page import="xyz.itwill.dto.MyHewon"%>
<%@page import="xyz.itwill.dao.MyHewonDAO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	List<MyHewon> hewonList=MyHewonDAO.getDAO().selectDiscriminatorHewonList();
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
<style type="text/css">
table {
	border: 1px solid black;
	border-collapse: collapse;
}

td {
	border: 1px solid black;
	text-align: center;
	padding: 3px;
}

.id { width: 150px; }
.name { width: 150px; }
.phone { width: 200px; }
.email { width: 200px; }
.status { width: 100px; }
</style>
</head>
<body>
	<h1>회원목록</h1>
	<hr>
	<table>
		<tr>
			<td class="id">아이디</td>
			<td class="name">이름</td>
			<td class="phone">전화번호</td>
			<td class="email">이메일</td>
			<td class="status">공개범위</td>
		</tr>
		<% if(hewonList.isEmpty()) { %>
			<tr>
				<td colspan="5">검색된 회원정보가 없습니다.</td>
			</tr>
		<% } else { %>
			<% for(MyHewon hewon : hewonList) { %>
			<tr>
				<td><%=hewon.getId() %></td>
				<td><%=hewon.getName() %></td>
				<td><%=hewon.getPhone() %></td>
				<td><%=hewon.getEmail() %></td>
				<td><%=hewon.getStatus() %></td>
			</tr>
			<% } %>
		<% } %>
	</table>
</body>
</html>

 


xml 매퍼 select 다른 방법으로 만들어보자

 

다른방법1)

 

모든 case 엘리먼트에 공통적인 매핑정보가 존재할 경우에는 discriminator 엘리먼트가 아닌 다른 하위 엘리먼트를 사용하여 매핑 정보 제공이 가능하다.

    <resultMap type="MyHewon" id="myHewonDiscriminatorResultMap">
        <id column="hewon_id" property="id"/>
        <result column="hewon_status" property="status"/>
        <discriminator javaType="int" column="hewon_status">
            <case value="2">
                <result column="hewon_name" property="name"/>
            </case>
            <case value="3">
                <result column="hewon_name" property="name"/>
                <result column="hewon_phone" property="phone"/>
            </case>
            <case value="4">
                <result column="hewon_name" property="name"/>
                <result column="hewon_phone" property="phone"/>
                <result column="hewon_email" property="email"/>
            </case>
        </discriminator>
    </resultMap>

    <select id="selectDiscriminatorHewonList" resultMap="myHewonDiscriminatorResultMap">
        select hewon_id, hewon_name, hewon_phone, hewon_email, hewon_status from myhewon order by hewon_id
    </select>

 

 

다른방법2)

 

extends 속성 이용하기

 

extends 속성 : resultMap 엘리먼트의 식별자를 속성값으로 설정할 수 있다.

→ 다른 resultMap 엘리먼트의 매핑정보를 상속받아 사용하기 위한 속성이다.

 

	<resultMap type="MyHewon" id="myHewonOneResultMap">
		<id column="hewon_id" property="id"/>
		<result column="hewon_status" property="status"/>
	</resultMap>
	
	<!-- extends 속성 : resultMap 엘리먼트의 식별자를 속성값으로 설정 -->
	<!-- => 다른 resultMap 엘리먼트의 매핑정보를 상속받아 사용하기 위한 속성 -->
	<resultMap type="MyHewon" id="myHewonTwoResultMap" extends="myHewonOneResultMap">
		<result column="hewon_name" property="name"/>
	</resultMap>
	
	<resultMap type="MyHewon" id="myHewonThreeResultMap" extends="myHewonTwoResultMap">
		<result column="hewon_phone" property="phone"/>
	</resultMap>
	
	<resultMap type="MyHewon" id="myHewonFourResultMap" extends="myHewonThreeResultMap">
		<result column="hewon_email" property="email"/>
	</resultMap>
	
	<resultMap type="MyHewon" id="myHewonDiscriminatorResultMap">
		<discriminator javaType="int" column="hewon_status">
			<!-- case 엘리먼트에 resultMap 속성을 사용하여 다른 resultMap 엘리먼트의 매핑정보를 제공받아 사용 가능 -->
			<case value="1" resultMap="myHewonOneResultMap"/>
			<case value="2" resultMap="myHewonTwoResultMap"/>
			<case value="3" resultMap="myHewonThreeResultMap"/>
			<case value="4" resultMap="myHewonFourResultMap"/>
		</discriminator>
	</resultMap>
	
	<select id="selectDiscriminatorHewonList" resultMap="myHewonDiscriminatorResultMap">
		select hewon_id, hewon_name, hewon_phone, hewon_email, hewon_status from myhewon order by hewon_id
	</select>