매퍼에 등록된 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"> 1 </option>
<option value="2"> 2 </option>
<option value="3"> 3 </option>
<option value="4"> 4 </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);
}
'학원 > 복기' 카테고리의 다른 글
[Mybatis] cache 엘리먼트 (0) | 2023.07.23 |
---|---|
[Mybatis] 전달값 표현식 / bind 엘리먼트 (0) | 2023.07.23 |
[Mybatis] discriminator 엘리먼트 (0) | 2023.07.21 |
[MyBatis] 조인예제(3) / collection 엘리먼트, autoMapping 속성 (0) | 2023.07.21 |
[MyBatis] 조인예제(2) / association 엘리먼트의 속성 (0) | 2023.07.21 |