framework/mybatis

[mybatis] 10. INTERFACE 기반의 매퍼파일 (MYHEWON)

jeri 2024. 7. 22. 21:20
반응형

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>

 

반응형