반응형
01. 인터페이스 기반의 매퍼파일
- 인터페이스 기반의 매퍼파일과 xml기반의 매퍼파일을 바인딩 처리하지 않고, 인터페이스 기반의 매퍼파일만 단독 사용
02. [Mapper] MyHewonInterfaceMapper.java
package xyz.itwill.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import xyz.itwill.dto.MyHewon;
//mybatis 프레임워크는 인터페이스만 이용하여 매퍼 설정 가능
// => 추상메소드에 매퍼 어노테이션(Mapper Annotation)을 사용하여 SQL 명령 등록
public interface MyHewonInterfaceMapper {
//추상메소드에 등록된 SELECT 명령은 기본적으로 검색결과를 자동 매핑처리하여 제공
// => 검색결과를 자동 매핑하기 위해서는 검색행의 컬럼명과 Java 클래스의 필드명이 반드시 동일
// => 검색행의 컬럼명과 Java 클래스의 필드명이 하나도 같지 않으면 Java 객체 대신 NULL 제공
//@Results : 검색행의 컬럼값을 Java 객체의 필드값으로 저장되도록 매핑 처리하는 정보를 제공하는 어노테이션
// => XML 기반의 매퍼 파일에서 resultMap 엘리먼트와 유사한 기능을 제공
// => 매핑 정보에 대한 재사용 불가능 - 유지보수의 효율성 감소
//value 속성 : 매핑정보를 제공하는 @Result 어노테이션 배열을 속성값으로 설정
// => 다른 속성이 없는 경우 속성값만 설정 가능
@Results(value = {
//@Result : 검색행의 컬럼값이 Java 객체 필드에 저장되도록 설정하는 어노테이션
// => XML 기반의 매퍼 파일에서 id(result) 엘리먼트와 유사한 기능을 제공
//column 속성 : 검색행의 컬럼명을 속성값으로 설정
//property 속성 : 검색행의 컬럼값이 저장될 Java 클래스의 필드명을 속성값으로 설정
@Result(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_state", property = "state")
})
@Select(value = "select * from myhewon order by hewon_id")
List<MyHewon> selectHewonList();
@Results({
@Result(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_state", property = "state")
})
@Select("select * from myhewon where hewon_name=#{name} order by hewon_id")
List<MyHewon> selectNameHewonList(String name);
/*
@Results({
@Result(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_state", property = "state")
})
//@SelectProvider : SQL Builder 클래스의 메소드를 호출하여 SELECT 명령을 반환받아 등록하는 어노테이션
// => 동적 SQL 기능을 사용하기 위한 어노테이션
//SQL Builder 클래스 : SQL 객체를 생성하여 메소드를 호출해 SQL 명령을 작성하고 객체에 저장된
//SQL 명령을 반환하는 기능을 제공하는 클래스
//type 속성 : SQL Builder 관련 클래스(Class 객체 - Clazz)를 속성값으로 설정
//method 속성 : SQL 객체를 생성하여 SQL 명령을 작성해 반환하는 메소드의 이름을 속성값으로 설정
@SelectProvider(type = MyHewonProvider.class, method = "selectDynamicName")
List<MyHewon> selectDynamicHewonList(String name);
*/
@Results({
@Result(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_state", property = "state")
})
//@Select 어노테이션의 value 속성값으로 script 엘리먼트를 사용하면 SQL 명령 작성시 동적
//SQL 관련 엘리먼트 사용 가능
// => value 속성값으로 배열을 설정하여 SQL 명령을 순차적으로 작성 가능
@Select({"<script>select * from myhewon"
," <if test=\\"name!=null and name!=''\\">where hewon_name=#{name}</if>"
," order by hewon_id</script>"})
List<MyHewon> selectDynamicHewonList(String name);
}
03. [Provider(SQL Builder)클래스] - MyHewonProvider.java
package xyz.itwill.mapper;
import org.apache.ibatis.jdbc.SQL;
//Provider 클래스(SQL Builder 클래스) : SQL 명령을 반환하는 메소드가 선언된 클래스
public class MyHewonProvider {
//Java 명령으로 동적 SQL 기능이 구현된 SQL 명령을 반환하는 메소드
public String selectDynamicName(String name) {
//SQL 객체 : SQL 명령 작성에 필요한 메소드를 호출하여 SQL 명령을 저장하기 위한 객체
//SQL.toString() : SQL 객체에 저장된 SQL 명령을 문자열(String 객체)로 변환하여 반환하는 메소드
return new SQL() {{ //어려운 명령을 좀 더 쉽게(빠르게) 만들기 위해 이렇게 작성함, 객체가 만들어지자마자 실행해주세요!
SELECT("*");
FROM("myhewon");
if(name!=null && !name.equals("")) {
WHERE("hewon_name=#{name}");
}
ORDER_BY("hewon_id");
}}.toString();
}
}
04. [DAO] MyHewonInterfaceDAO.java
package xyz.itwill.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import xyz.itwill.dto.MyHewon;
import xyz.itwill.mapper.MyHewonInterfaceMapper;
public class MyHewonInterfaceDAO extends AbstractSession {
private static MyHewonInterfaceDAO _dao;
private MyHewonInterfaceDAO() {
// TODO Auto-generated constructor stub
}
static {
_dao=new MyHewonInterfaceDAO();
}
public static MyHewonInterfaceDAO getDAO() {
return _dao;
}
//selectHewonList
public List<MyHewon> selectHewonList() {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.getMapper(MyHewonInterfaceMapper.class).selectHewonList();
} finally {
sqlSession.close();
}
}
//selectNameHewonList
public List<MyHewon> selectNameHewonList(String name) {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.getMapper(MyHewonInterfaceMapper.class).selectNameHewonList(name);
} finally {
sqlSession.close();
}
}
//selectDynamicHewonList
public List<MyHewon> selectDynamicHewonList(String name) {
SqlSession sqlSession=getSqlSessionFactory().openSession(true);
try {
return sqlSession.getMapper(MyHewonInterfaceMapper.class).selectDynamicHewonList(name);
} finally {
sqlSession.close();
}
}
}
05. [JSP] hewonListInterfaceSelect.jsp
<%@page import="xyz.itwill.dao.MyHewonInterfaceDAO"%>
<%@page import="xyz.itwill.dto.MyHewon"%>
<%@page import="java.util.List"%>
<%@page import="xyz.itwill.dao.MyHewonDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
/*
//동적SQL기능 미사용
List<MyHewon> hewonList = null;
if(name==null || name.equals("")){
hewonList=MyHewonInterfaceDAO.getDAO().selectHewonList();
} else {
hewonList=MyHewonInterfaceDAO.getDAO().selectNameHwonList(name);
}
*/
//동적SQL기능 사용
List<MyHewon> hewonList=MyHewonInterfaceDAO.getDAO().selectDynamicHewonList(name);
%>
<!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;}
.state {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="state">공개범위</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.getState() %></td>
</tr>
<%} %>
<%} %>
</table>
<br>
<form method="post">
이름 : <input type="text" name="name">
<button type="submit">검색</button>
</form>
</body>
</html>
반응형
'framework > mybatis' 카테고리의 다른 글
[mybatis] 9. XML+INTERFACE 매퍼(매퍼바인딩) 3 (MYHEWON) (0) | 2024.07.22 |
---|---|
[mybatis] 8. XML+INTERFACE 매퍼(매퍼바인딩) 2 (MYUSER, MYCOMMENT, MYREPLY) (0) | 2024.07.21 |
[mybatis] 7. XML+INTERFACE 매퍼(매퍼바인딩) 1 (MYUSER) (1) | 2024.07.21 |
[mybatis] 6. XML + 인터페이스 기반의 매퍼파일 (MyMember 출력 프로그램) (1) | 2024.07.21 |
[mybatis] 5. 인터페이스 기반의 매퍼파일 (MyMember 출력 프로그램) (1) | 2024.07.20 |