본문 바로가기

학원/복기

[MyBatis] 매퍼에 등록된 SQL 명령에 필요한 값 전달하기 / Map 객체 이용하기

매퍼에 등록된 SQL 명령에 필요한 값을 전달하는 방법에 대해 알아보자

 

전달값은 SQL 명령에서 #{변수명|필드명|맵키} 형식으로 표현하여 사용한다.

 

 

1.

XML 기반의 매퍼 파일에서 SQL 명령이 등록된 엘리먼트의 parameterType 속성값으로 Java 자료형(별칭)을 설정하여 값을 전달받아 SQL 명령에서 사용할 수 있다.

 

단일값을 전달받기 위해서는 parameterType 속성에 원시형(PrimitiveType)을 사용할 수 있다. (원시형 대신 Wrapper 클래스 사용 가능) 또는 Stirng 클래스를 속성값으로 설정한다. - SQL 명령에서는 #{변수명} 형식으로 전달값을 사용할 수 있다.

 

다수값을 전달받기 위해서는 parameterType 속성에 JavaBean(DTO 클래스)를 속성값으로 설정하면 된다. - SQL 명령에서는 #{필드명} 형식으로 전달값(필드값)을 사용할 수 있다.

 

또는 다수값을 전달받기 위해 parameterType 속성에 HashMap 클래스(Map 인터페이스)를 속성값으로 설정할 수 있다. - SQL 명령에서는 #{맵키} 형식으로 전달값(맵값)을 사용할 수 있다.

 

 

2.

Interface 기반의 매퍼 파일에서 추상메소드의 매개변수에 @Param 어노테이션을 설정하여 매개변수에 전달되어 저장된 값을 SQL 명령에서 사용할 수 있다.

매퍼 바인딩을 한 경우 XML 기반의 매퍼 파일의 엘리먼트에서 SQL 명령의 전달값 사용할 수 있다.

주의) Interface 기반의 매퍼 파일의 추상메소드 매개변수로 전달받은 값을 XML 기반의 매퍼 파일의 엘리먼트에서 사용할 경우 parameterType 속성을 반드시 생략해야한다.

 


 

 

예제)

공개범위를 전달받아 MYHEWON 테이블에 저장된 회원정보 중 해당 공개범위의 회원정보를 검색하여 검색결과를 객체로 제공하는 엘리먼트 만들기

→ 값을 하나만 전달받아 SQL 명령에서 사용할 경우 parameterType 속성값으로 원시형(Wrapper 클래스) 또는 String 클래스를 설정하고 SQL 명령에서는 #{변수명} 형식으로 전달값을 표현한다.

→ 변수명은 어떤 이름을 사용해도 상관 없으며 식별자 작성 규칙에 맞게만 작성해주면 된다.

 

xml매퍼

[MyHewonMapper.xml]

<select id="selectStatusHewonList" parameterType="int" resultMap="myHewonResultMap">
	select hewon_id, hewon_name, hewon_phone, hewon_email, hewon_status from myhewon 
		where hewon_status=#{status} order by hewon_id
</select>

 

XML 기반의 매퍼 파일의 엘리먼트에서는 parameterType 속성값으로 원시형(Wrapper 클래스) 또는 String 클래스를 설정하여 값을 하나만 전달받은 경우 parameterType 속성 생략이 가능하다.

<select id="selectStatusHewonList" resultMap="myHewonResultMap">
	select hewon_id, hewon_name, hewon_phone, hewon_email, hewon_status from myhewon 
		where hewon_status=#{status} order by hewon_id
</select>

 

인터페이스 매퍼

[MyHewonMapper]

public interface MyHewonMapper {
	List<MyHewon> selectStatusHewonList(int status);
}

DAO 

[MyHewonDAO]

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

JSP

[hewonListStatusSelect.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"%>
<%
	int status=0;
	if(request.getParameter("status")!=null) {
		status=Integer.parseInt(request.getParameter("status"));
	}
	
	List<MyHewon> hewonList=null;
	if(status==0) {
		hewonList=MyHewonDAO.getDAO().selectHewonList();//전체 검색
	} else {
		hewonList=MyHewonDAO.getDAO().selectStatusHewonList(status);//조건 검색
	}
%>    
<!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>
	<br>
	
	<form method="post">
		회원검색(공객범위) :
		<select name="status">
			<option value="0" selected="selected">전체</option>
			<option value="1">&nbsp;1&nbsp;</option>
			<option value="2">&nbsp;2&nbsp;</option>
			<option value="3">&nbsp;3&nbsp;</option>
			<option value="4">&nbsp;4&nbsp;</option>
		</select>	
		<button type="submit">검색</button>
	</form>
</body>
</html>

 

이름과 이메일을 전달받아 MYHEWON 테이블에 저장된 회원정보 중 해당 이름과 이메일의 회원정보 아이디를 검색하여 검색결과를 문자열 제공하는 엘리먼트 작성 

→ 값을 여러개 전달받아 SQL 명령에서 사용하고자 할 경우 parameterType 속성값으로 클래스(DTO)를 설정하여 객체를 전달받아 SQL 명령에서 #{필드명} 형식으로 표현하여 객체 필드값을 사용한다. 

<select id="selectBeanHewonId" parameterType="MyHewon" resultType="string">
	select hewon_id from myhewon where hewon_name=#{name} and hewon_email=#{email} 
</select>

 

매퍼 바인딩하여 Interface 기반의 매퍼 파일을 사용할 경우 전달값에 상관없이 parameterType 속성을 생략할 수 있다.

<select id="selectBeanHewonId" resultType="string">
	select hewon_id from myhewon where hewon_name=#{name} and hewon_email=#{email} 
</select>

 

인터페이스 매퍼

public interface MyHewonMapper {
	//...
    	//...
	String selectBeanHewonId(MyHewon hewon);
}

 

DAO

	public String selectBeanHewonId(MyHewon hewon) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyHewonMapper.class).selectBeanHewonId(hewon);
		} finally {
			sqlSession.close();
		}
	}

 

JSP

[HewonIdBeanSelect.jsp]

<%@page import="xyz.itwill.dao.MyHewonDAO"%>
<%@page import="xyz.itwill.dto.MyHewon"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");

	String name=request.getParameter("name");
	String email=request.getParameter("email");
	
	String id="";
	if(name!=null && email!=null) {
		MyHewon hewon=new MyHewon();
		hewon.setName(name);
		hewon.setEmail(email);
		
		id=MyHewonDAO.getDAO().selectBeanHewonId(hewon);
	}
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
</head>
<body>
	<h1>아이디 찾기</h1>
	<hr>
	<form method="post" name="searchForm" id="searchForm">
	<table>
		<tr>
			<td>이름</td>
			<td><input type="text" name="name"></td>
		</tr>
		<tr>
			<td>이메일</td>
			<td><input type="text" name="email"></td>
		</tr>
		<tr>
			<td colspan="2"><button type="submit">아이디 검색</button></td>
		</tr>
	</table>
	</form>
	<hr>
	
	<% if(name!=null && email!=null) { %>
	<div style="font-weight: bold; color: red;">
		<% if(id==null || id.equals("")) { %>
			<%=name %>님의 아이디가 존재하지 않습니다.
		<% } else { %>
			<%=name %>님의 아이디는 [<%=id %>]입니다.
		<% } %>
	</div>
	<% } %>
	 
	<script type="text/javascript">
	document.getElementById("searchForm").onsubmit=function() {
		if(searchForm.name.value=="") {
			alert("이름을 입력해 주세요.");
			return false;
		}
		
		if(searchForm.eamil.value=="") {
			alert("이메일을 입력해 주세요.");
			return false;
		}
	}
	</script>
</body>
</html>

 


을 이용해보자

 

이름과 이메일을 전달받아 MYHEWON 테이블에 저장된 회원정보 중 해당 이름과 이메일의  회원정보 아이디를 검색하여 검색결과를 문자열 제공하는 엘리먼트를 다시 등록해보자.

→ 값을 여러개 전달받아 SQL 명령에서 사용하고자 할 경우 parameterType 속성값으로  HashMap 클래스(Map  인터페이스)를 설정하여 Map 객체를 전달받아 SQL 명령에서 #{맵키} 형식으로 표현하여 Map 객체의 맵값을 사용할 수 있다.

 

<select id="selectMapHewonId" parameterType="map" resultType="string">
	select hewon_id from myhewon where hewon_name=#{name} and hewon_email=#{email} 
</select>

 

인터페이스 매퍼

 

HashMap 클래스(Map 인터페이스)를 매개변수로 설정할 경우 제네릭은 맵키를 [String] 클래스로 설정하고 맵값은 [Object] 클래스로 설정하여 사용한다.

public interface MyHewonMapper {
	//...
    	//...
        
	//HashMap 클래스(Map 인터페이스)를 매개변수로 설정할 경우 제네릭은 맵키를 [String] 클래스로 
	//설정하고 맵값은 [Object] 클래스로 설정하여 사용
	String selectMapHewonId(Map<String, Object> map);
}

 

DAO

	public String selectMapHewonId(Map<String, Object> map) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyHewonMapper.class).selectMapHewonId(map);
		} finally {
			sqlSession.close();
		}
	}

 

JSP

[hewonIdMapSelect.jsp]

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="xyz.itwill.dao.MyHewonDAO"%>
<%@page import="xyz.itwill.dto.MyHewon"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");

	String name=request.getParameter("name");
	String email=request.getParameter("email");
	
	String id="";
	if(name!=null && email!=null) {
		Map<String, Object> map=new HashMap<>();
		map.put("name", name);
		map.put("email", email);
		
		id=MyHewonDAO.getDAO().selectMapHewonId(map);
	}
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
</head>
<body>
	<h1>아이디 찾기</h1>
	<hr>
	<form method="post" name="searchForm" id="searchForm">
	<table>
		<tr>
			<td>이름</td>
			<td><input type="text" name="name"></td>
		</tr>
		<tr>
			<td>이메일</td>
			<td><input type="text" name="email"></td>
		</tr>
		<tr>
			<td colspan="2"><button type="submit">아이디 검색</button></td>
		</tr>
	</table>
	</form>
	<hr>
	
	<% if(name!=null && email!=null) { %>
	<div style="font-weight: bold; color: red;">
		<% if(id==null || id.equals("")) { %>
			<%=name %>님의 아이디가 존재하지 않습니다.
		<% } else { %>
			<%=name %>님의 아이디는 [<%=id %>]입니다.
		<% } %>
	</div>
	<% } %>
	 
	<script type="text/javascript">
	document.getElementById("searchForm").onsubmit=function() {
		if(searchForm.name.value=="") {
			alert("이름을 입력해 주세요.");
			return false;
		}
		
		if(searchForm.eamil.value=="") {
			alert("이메일을 입력해 주세요.");
			return false;
		}
	}
	</script>
</body>
</html>

 


 

insert 할 때 삽입행의 컬럼값들을 DTO 객체로 전달받아 삽입처리할 수도 있지만 맵 객체로 전달받아 삽입처리할 수도 있다. 

 

xml매퍼

<insert id="insertMapHewon" parameterType="map">
	insert into myhewon values(#{id}, #{name}, #{phone}, #{email}, #{status})
</insert>

 

인터페이스 매퍼

int insertMapHewon(Map<String, Object> map);

select 엘리먼트의 resultType 속성값을 HashMap 클래스(Map 인터페이스)로 설정하면 하나의 검색행을 Map 객체로 생성하여 제공할 수 있다.

→ 검색행의 컬럼명을 맵키로  매핑하고 컬럼값을 엔트리의 맵값으로 매핑하여 엔트리로 추가한다. 단, 검색행의 컬럼명은 대문자로 검색되어 맵키로 매핑 처리된다.

 

xml매퍼

<select id="selectMapHewonList" resultType="map">
	select hewon_id, hewon_name, hewon_phone, hewon_email, hewon_status from myhewon order by hewon_id
</select>

 


 

인터페이스 매퍼를 이용해 값을 전달받아 XML 매퍼에서 사용할 수 있도록 해볼것이다

 

이름과 이메일을 전달받아 MYHEWON 테이블에 저장된 회원정보 중 해당 이름과 이메일의 회원정보 아이디를 검색하여 검색결과를 문자열 제공하는 엘리먼트 작성 

→ 매퍼 바인딩한 경우 Interface 기반의 매퍼 파일에서 추상메소드의 매개변수에 전달되어 저장된 값을 @Param 어노테이션을 사용해 value 속성값으로 제공받아 SQL 명령에서 #{속성값} 형식으로 표현하여 매개변수의 값을 사용 - prameterType 속성을 반드시 생략해야한다.

 

xml 매퍼

<select id="selectParamHewonId" resultType="string">
	select hewon_id from myhewon where hewon_name=#{name} and hewon_email=#{email}
</select>

 

인터페이스 매퍼

 

@Param : 추상메소드의 매개변수에 저장된 값을 XML 기반의 매퍼 파일의 엘리먼트에게 전달하여 SQL 명령에서 사용할 수 있도록 제공하는 어노테이션

- value 속성 : 매개변수에 저장된 값을 XML 기반의 매퍼 파일의 엘리먼트에 등록된 SQL 명령에서 사용할 수 있는 식별자를 속성값으로 설정 → 다른 속성이 없는 경우 속성값만 설정 가능

 

public interface MyHewonMapper {
	//...
    	//...
	String selectParamHewonId(@Param(value = "name") String name,@Param("email") String email);
}