Mybatis - XML,Interface,매퍼 바인딩(Mapper Binding)

yeong ·2023년 2월 1일

mybatis

목록 보기
2/4

mybatis 프레임워크에는 XML 기반의 매퍼 파일과 Interface 기반의 매퍼 파일을 이용하여 매퍼설정이 가능하고 매퍼 바인딩사용도 가능하다.


환경설정 파일

<!-- mappers : 1개 이상의 mapper 엘리먼트를 등록하기 위한 상위 엘리먼트 -->
</configuration>

	...
	...
	<environments>...</environments>
	<!-- 매퍼를 제외하고는 생략-->

	<mappers>
		<!-- mapper : 매퍼(Mapper)을 등록하기 위한 엘리먼트 -->
		<!-- 매퍼(Mapper) : SQL 명령에 필요한 값을 전달받아 SQL 명령을 등록하고 실행결과를
		Java 객체(원시형)로 매핑하기 위한 정보를 제공 -->
		<!-- mybatis 프레임워크에는 XML 기반의 매퍼 파일과 Interface 기반의 매퍼 파일을 이용하여 매퍼 설정 -->
		<!-- => ibatis 프레임워크에는 XML 기반의 매퍼 파일로만 매퍼 설정 가능 -->
		<!-- resource 속성 : XML 기반의 매퍼 파일에 경로를 속성값으로 설정 -->
		<!-- => XML 기반의 매퍼 파일 경로는 파일 시스템 경로를 기반으로 작성 -->
		<!-- XML 기반의 매퍼 파일의 장점 : 수동 매핑 설정과 동적 SQL 설정에 대한 기능 구현이 편리 -->
		<!-- XML 기반의 매퍼 파일의 단점 : SqlSession 객체로 SQL 명령을 제공받아 사용하기 불편 -->
		<mapper resource="xyz/itwill/mapper/StudentMapper.xml"/>
		<mapper resource="xyz/itwill/mapper/MyMemberXMLMapper.xml"/>

		<!-- class 속성 : Interface 기반의 매퍼 파일의 경로를 속성값으로 설정 -->
		<!-- => Interface 기반의 매퍼 파일 경로는 Java 자료형(인터페이스)을 기반으로 작성 -->
		<!-- Interface 기반의 매퍼 파일의 장점 : SqlSession 객체로 SQL 명령을 제공받아 사용하기 편리 -->
		<!-- Interface 기반의 매퍼 파일의 단점 : 수동 매핑 설정과 동적 SQL 설정에 대한 기능 구현이 불편 -->
		<!-- <mapper class="xyz.itwill.mapper.MyMemberInterfaceMapper"/> -->
		
		<!-- XML 기반의 매퍼 파일과 Interface 기반의 매퍼 파일을 하나의 매퍼로 동작되도록 설정 가능 -->
		<!-- 매퍼 바인딩(Mapper Binding) : SQL 명령은 XML 기반의 매퍼 파일에 등록하고 DAO
		클래스의 메소드는 Interface 기반의 매퍼 파일의 추상메소드를 호출하여 작성 -->
		<!-- mapper 엘리먼트에는 XML 기반의 매퍼 파일만 등록하여 사용 -->
		<!-- <mapper resource="xyz/itwill/mapper/MyMemberMapper.xml"/> -->
		
		<!-- package : 특정 패키지에 작성된 모든 Interface 기반의 매퍼 파일을 자동으로 
		매퍼로 등록하기 위한 엘리먼트 -->
		<!-- name 속성 : Interface 기반의 매퍼 파일이 작성된 패키지를 속성값으로 설정 -->
		<package name="xyz.itwill.mapper"/>
	</mappers>
</configuration>

xml

mapper(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="MyMemberXMLMapper">
	<!-- insert : INSERT 명령을 등록하기 위한 엘리먼트 -->
	<!-- id 속성 : SQL 명령이 등록된 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 -->
	<!-- parameterType 속성 : SQL 명령에 필요한 값을 제공받기 위한 객체(값)의 Java 자료형을 속성값으로 설정 -->
	<!-- => Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용 가능 -->
	<!-- => SQL 명령에 필요한 값이 없는 경우 parameterType 속성 생략 -->
	<!-- DML 명령(INSERT,UPDATE,DELETE) 관련 엘리먼트는 등록된 SQL 명령 실행 후 조작행의
	갯수를 무조건 정수값(int)으로 매핑하여 재공하므로 resultType 속성 생략 -->
	<insert id="insertMember" parameterType="MyMember">
		<!-- parameterType 속성으로 전달받은 값은 SQL 명령에서 #{변수명|필드명|맵키} 형식으로 표현하여 사용 -->
		<!-- => parameterType 속성으로 전달받은 값이 Java 객체인 경우 #{필드명} 형식으로 
		필드값을 제공받아 사용 - Getter 메소드 자동 호출 -->
		<!-- => ibatis 프레임워크에서는 #변수명|필드명|맵키# 형식으로 표현하여 사용 -->
		insert into mymember values(#{id},#{name},#{phone},#{email})
	</insert>
	
	<!-- update : UPDATE 명령을 등록하기 위한 엘리먼트 -->
	<update id="updateMember" parameterType="MyMember">
		update mymember set name=#{name},phone=#{phone},email=#{email} where id=#{id}
	</update>
	
	<!-- delete : DELETE 명령을 등록하기 위한 엘리먼트 -->
	<delete id="deleteMember" parameterType="string">
		<!-- parameterType 속성으로 하나의 값만 전달된 경우 #{변수명} 형식으로 전달값을 제공받아 사용 -->
		<!-- => 변수명은 특별한 형식없이 표현하여 사용 가능 -->
		delete from mymember where id=#{id}
	</delete>
	
	<!-- select : SELECT 명령을 등록하기 위한 엘리먼트 -->
	<!-- => 반드시 resultType 속성(resultMap 속성)을 설정하여 매핑정보를 제공받아 사용 -->
	<!-- resultType 속성 : 검색결과를 제공하기 위한 객체(값)의 Java 자료형을 속성값으로 설정 -->
	<!-- => Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용 가능 -->
	<!-- resultType 속성값으로 Java 클래스를 설정한 경우 클래스로 객체를 생성하여 검색행의
	컬럼값을 같은 이름의 필드에 자동 저장하여 제공 - 자동 매핑 -->
	<select id="selectMember" parameterType="string" resultType="MyMember">
		select * from mymember where id=#{id}
	</select>
	
	<!-- SELECT 명령에 의해 여러개 행이 검색되도 resultType 속성에는 하나의 검색행에 대한 
	Java 자료형을 속성값으로 설정 -->
	<select id="selectMemberList" resultType="MyMember">
		select * from mymember order by id
	</select>
</mapper>

DAO(xml)

package xyz.itwill.dao;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import xyz.itwill.dto.MyMember;

public class MyMemberXMLDAO {
	private static MyMemberXMLDAO _dao;
	
	private MyMemberXMLDAO() {
		// TODO Auto-generated constructor stub
	}
	
	static {
		_dao=new MyMemberXMLDAO();
	}
	
	public static MyMemberXMLDAO getDAO() {
		return _dao;
	}
	
	//SqlSessionFactory 객체를 생성하여 반환하는 메소드
	private SqlSessionFactory getSqlSessionFactory() {
		String resource="mybatis-config.xml";
		InputStream inputStream=null;
		try {
			inputStream=Resources.getResourceAsStream(resource);
		} catch (IOException e) {
			throw new IllegalArgumentException(e);
		}
		return new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	//회원정보를 전달받아 MYMEMBER 테이블에 삽입하고 삽입행의 갯수를 반환하는 메소드
	public int insertMember(MyMember member) {
		SqlSession sqlSession=getSqlSessionFactory().openSession();
		try {
			//SqlSession.insert(String elementId, Object parameterValue) : 매퍼에 등록된 insert 
			//엘리먼트의 SQL 명령을 제공받아 전달하여 실행하고 삽입행의 갯수를 반환하는 메소드
			// => elementId : SQL 명령이 등록된 맵퍼와 엘리먼트의 식별자를 매개변수에 전달
			// => parameterValue : SQL 명령에 필요한 객체(값)을 매개변수에 전달 - parameterType 속성값으로 사용
			// => 엘리먼트에 전달할 값이 없는 경우 parameterValue 매개변수에 값 전달 생략
			int rows=sqlSession.insert("MyMemberXMLMapper.insertMember",member);
			
			//mybatis 프레임워크는 기본적으로 AutoCommit 기능을 비활성화 처리하고 SQL 명령을 전달하여 실행
			// => DML 명령을 전달하여 실행한 경우 반드시 트렌젝션 관련 메소드 호출하여 커밋 또는 롤백 처리
			if(rows>0) {
				//SqlSession.commit() : 트렌젝션 적용 명령(COMMIT) 명령을 전달하여 실행하는 메소드 - 커밋 처리
				sqlSession.commit();
			} else {
				//SqlSession.rollback() : 트렌젝션 취소 명령(ROLLBACK) 명령을 전달하여 실행하는 메소드 - 롤백 처리
				sqlSession.rollback();
			}
			
			return rows;
		} finally {
			sqlSession.close();
		}
	}
	
	//회원정보를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 변경하고 변경행의 갯수를 반환하는 메소드
	public int updateMember(MyMember member) {
		//SqlSessionFactory.openSession(boolean autoCommit) : SqlSession 객체를 생성하여 반환하는 메소드
		// => false : AutoCommit 기능 비활성화(기본), true : AutoCommit 기능 활성화
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			//SqlSession.update(String elementId, Object parameterValue) : 매퍼에 등록된 update 
			//엘리먼트의 SQL 명령을 제공받아 전달하여 실행하고 변경행의 갯수를 반환하는 메소드
			return sqlSession.update("MyMemberXMLMapper.updateMember", member);
		} finally {
			sqlSession.close();
		}
	}
	
	//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 삭제하고 삭제행의 갯수를 반환하는 메소드
	public int deleteMember(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			//SqlSession.delete(String elementId, Object parameterValue) : 매퍼에 등록된 delete 
			//엘리먼트의 SQL 명령을 제공받아 전달하여 실행하고 삭제행의 갯수를 반환하는 메소드
			return sqlSession.delete("MyMemberXMLMapper.deleteMember", id);
		} finally {
			sqlSession.close();
		}
	}
	
	//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 검색하여 반환하는 메소드
	public MyMember selectMemeber(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			//SqlSession.selectOne(String elementId, Object parameterValue) : 매퍼에 등록된  
			//select 엘리먼트의 SQL 명령을 제공받아 전달하여 실행하고 검색결과를 하나의
			//객체(값)으로 매핑하여 반환하는 메소드
			// => 하나의 행만 검색하는 SELECT 명령을 전달하여 실행할 경우 호출하는 메소드
			return sqlSession.selectOne("MyMemberXMLMapper.selectMember",id);
		} finally {
			sqlSession.close();
		}
	}
	
	//MYMEMBER 테이블에 저장된 모든 회원정보를 검색하여 반환하는 메소드
	public List<MyMember> selectMemberList() {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			//SqlSession.selectList(String elementId, Object parameterValue) : 매퍼에 등록된  
			//select 엘리먼트의 SQL 명령을 제공받아 전달하여 실행하고 검색결과를 요소로 생성
			//되도록 매핑하고 List 객체에 추가하여 반환하는 메소드
			// => 여러 개의 행을 검색하는 SELECT 명령을 전달하여 실행할 경우 호출하는 메소드
			return sqlSession.selectList("MyMemberXMLMapper.selectMemberList");
		} finally {
			sqlSession.close();
		}
	}
}





interface

mapper(interface)

package xyz.itwill.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import xyz.itwill.dto.MyMember;

//mybatis 프레임워크에서는 인터페이스를 이용하여 매퍼 설정 가능
// => 추상메소드에 매퍼 어노테이션(Mapper Annotation)을 사용하여 SQL 명령 등록
public interface MyMemberInterfaceMapper {
	//@Insert : 추상메소드에 INSERT 명령을 등록하기 위한 어노테이션
	//value 속성 : 추상메소드에 등록할 SQL 명령을 속성값으로 설정
	// => value 속성외에 다른 속성이 없는 경우 속성값만 설정 가능
	@Insert("insert into mymember values(#{id},#{name},#{phone},#{email})")
	//추상메소드의 매개변수는 SQL 명령에 필요한 객체(값)을 전달하기 위해 선언하며 반환형은
	//등록된 SQL 명령을 전달하여 실행한 결과를 제공받기 위한 Java 자료형을 선언 
	int insertMember(MyMember member);
	
	//@Update : 추상메소드에 UPDATE 명령을 등록하기 위한 어노테이션
	@Update("update mymember set name=#{name},phone=#{phone},email=#{email} where id=#{id}")
	int updateMember(MyMember member);
	
	//@Delete : 추상메소드에 DELETE 명령을 등록하기 위한 어노테이션
	@Delete("delete from mymember where id=#{id}")
	int deleteMember(String id);
	
	//@Select : 추상메소드에 SELECT 명령을 등록하기 위한 어노테이션
	@Select("select * from mymember where id=#{id}")
	MyMember selectMember(String id);
	
	@Select("select * from mymember order by id")
	List<MyMember> selectMemberList();
}

DAO(interface)

package xyz.itwill.dao;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import xyz.itwill.dto.MyMember;
import xyz.itwill.mapper.MyMemberInterfaceMapper;

public class MyMemberInterfaceDAO {
	private static MyMemberInterfaceDAO _dao;
	
	private MyMemberInterfaceDAO() {
		// TODO Auto-generated constructor stub
	}
	
	static {
		_dao=new MyMemberInterfaceDAO();
	}
	
	public static MyMemberInterfaceDAO getDAO() {
		return _dao;
	}
	
	//SqlSessionFactory 객체를 생성하여 반환하는 메소드
	private SqlSessionFactory getSqlSessionFactory() {
		String resource="mybatis-config.xml";
		InputStream inputStream=null;
		try {
			inputStream=Resources.getResourceAsStream(resource);
		} catch (IOException e) {
			throw new IllegalArgumentException(e);
		}
		return new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	//회원정보를 전달받아 MYMEMBER 테이블에 삽입하고 삽입행의 갯수를 반환하는 메소드
	public int insertMember(MyMember member) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			//SqlSession.getMaaper(Class<T> clazz) : 메모리에 저장된 인터페이스(맵퍼)를 
			//제공받아 Mapper 객체로 생성하여 반환하는 메소드
			// => 매개변수에 [XXX.class] 형식으로 인터페이스를 직접 표현하여 Class 객체(Clazz)를 전달
			//Mapper 객체 : 인터페이스를 제공받아 생성되며 추상메소드를 호출하여 등록된 SQL  
			//명령을 전달하여 실행하고 실행결과를 매핑하여 반환하기 위한 기능을 제공하는 객체
			return sqlSession.getMapper(MyMemberInterfaceMapper.class).insertMember(member);
		} finally {
			sqlSession.close();
		}
	}
	
	//회원정보를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 변경하고 변경행의 갯수를 반환하는 메소드
	public int updateMember(MyMember member) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberInterfaceMapper.class).updateMember(member);
		} finally {
			sqlSession.close();
		}
	}
	
	//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 삭제하고 삭제행의 갯수를 반환하는 메소드
	public int deleteMember(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberInterfaceMapper.class).deleteMember(id);
		} finally {
			sqlSession.close();
		}
	}
	
	//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 검색하여 반환하는 메소드
	public MyMember selectMemeber(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberInterfaceMapper.class).selectMember(id);
		} finally {
			sqlSession.close();
		}
	}
	
	//MYMEMBER 테이블에 저장된 모든 회원정보를 검색하여 반환하는 메소드
	public List<MyMember> selectMemberList() {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberInterfaceMapper.class).selectMemberList();
		} finally {
			sqlSession.close();
		}
	}
}





매퍼 바인딩(Mapper Binding)(xml + interface)

mapper(매퍼 바인딩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">
<!-- XML 기반의 매퍼 파일과 Interface 기반의 매퍼 파일을 바인딩하여 하나의 매퍼로 동작되도록 설정하는 방법 -->
<!-- => XML 기반의 매퍼 파일에서 mapper 엘리먼트의 namespace 속성값과 같은 이름으로 Interface 매퍼 파일 생성 -->
<!-- => XML 기반의 매퍼 파일에서 SQL 명령을 등록한 엘리먼트와 동일한 형식으로 Interface 기반의
매퍼 파일에 추상메소드 작성 -->
<mapper namespace="xyz.itwill.mapper.MyMemberMapper">
	<!-- DAO 클래스의 메소드에서 Interface 기반의 매퍼 파일에 추상메소드를 호출할 경우 동일한
	형식의 XML 기반의 매퍼 파일에 엘리먼트에 등록된 SQL 명령을 전달하여 실행 -->
	<!-- => 엘리먼트의 id 속성값과 동일한 이름의 추상메소드 선언 -->
	<!-- => 엘리먼트의 parameterType 속성값과 동일한 자료형으로 추상메소드의 매개변수를 선언 -->
	<!-- => 엘리먼트의 resultType 속성값과 동일한 자료형으로 추상메소드의 반환형을 선언 -->
	<insert id="insertMember" parameterType="MyMember">
		insert into mymember values(#{id},#{name},#{phone},#{email})
	</insert>
	
	<update id="updateMember" parameterType="MyMember">
		update mymember set name=#{name},phone=#{phone},email=#{email} where id=#{id}
	</update>
	
	<delete id="deleteMember" parameterType="string">
		delete from mymember where id=#{id}
	</delete>
	
	<select id="selectMember" parameterType="string" resultType="MyMember">
		select * from mymember where id=#{id}
	</select>
	
	<select id="selectMemberList" resultType="MyMember">
		select * from mymember order by id
	</select>
</mapper>

mapper(매퍼 바인딩interface)

package xyz.itwill.mapper;

import java.util.List;

import xyz.itwill.dto.MyMember;

public interface MyMemberMapper {
	int insertMember(MyMember member);
	int updateMember(MyMember member);
	int deleteMember(String id);
	MyMember selectMember(String id);
	List<MyMember> selectMemberList();
}

DAO(매퍼 바인딩)

package xyz.itwill.dao;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import xyz.itwill.dto.MyMember;
import xyz.itwill.mapper.MyMemberMapper;

public class MyMemberDAO {
	private static MyMemberDAO _dao;
	
	private MyMemberDAO() {
		// TODO Auto-generated constructor stub
	}
	
	static {
		_dao=new MyMemberDAO();
	}
	
	public static MyMemberDAO getDAO() {
		return _dao;
	}
	
	//SqlSessionFactory 객체를 생성하여 반환하는 메소드
	private SqlSessionFactory getSqlSessionFactory() {
		String resource="mybatis-config.xml";
		InputStream inputStream=null;
		try {
			inputStream=Resources.getResourceAsStream(resource);
		} catch (IOException e) {
			throw new IllegalArgumentException(e);
		}
		return new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	//회원정보를 전달받아 MYMEMBER 테이블에 삽입하고 삽입행의 갯수를 반환하는 메소드
	public int insertMember(MyMember member) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberMapper.class).insertMember(member);
		} finally {
			sqlSession.close();
		}
	}
	
	//회원정보를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 변경하고 변경행의 갯수를 반환하는 메소드
	public int updateMember(MyMember member) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberMapper.class).updateMember(member);
		} finally {
			sqlSession.close();
		}
	}
	
	//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 삭제하고 삭제행의 갯수를 반환하는 메소드
	public int deleteMember(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberMapper.class).deleteMember(id);
		} finally {
			sqlSession.close();
		}
	}
	
	//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 검색하여 반환하는 메소드
	public MyMember selectMemeber(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberMapper.class).selectMember(id);
		} finally {
			sqlSession.close();
		}
	}
	
	//MYMEMBER 테이블에 저장된 모든 회원정보를 검색하여 반환하는 메소드
	public List<MyMember> selectMemberList() {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberMapper.class).selectMemberList();
		} finally {
			sqlSession.close();
		}
	}
}

0개의 댓글