본문 바로가기

학원/복기

[MyBatis] 예제

테이블 생성

create table mymember(id varchar2(50) primary key, name varchar2(50)
    ,phone varchar2(20), email varchar2(100));

 
테이블의 행을 표현할 수 있는 클래스, DTO 클래스 생성

package xyz.itwill.dto;

//create table mymember(id varchar2(50) primary key, name varchar2(50),phone varchar2(20), email varchar2(100));

public class MyMember {
	private String id;
	private String name;
	private String phone;
	private String email;
	
	public MyMember() {
		// TODO Auto-generated constructor stub
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	
}

[mybatis-config.xml] 에서 매퍼 등록

<mappers>
	<mapper resource="xyz/itwill/mapper/MyMemberXMLMapper.xml"/>
</mappers>

[MyMemberXMLMapper.xml] 생성
 
 

insert : INSERT 명령을 등록하기 위한 엘리먼트
 - id 속성 : SQL 명령이 등록된 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정한다.
 - parameterType 속성 : SQL 명령 작성에 필요한 값을 제공하기 위한 Java 객체의 자료형을 속성값으로 설정한다.
   → Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용이 가능하다.
   → SQL 명령 작성에 필요한 값이 없는 경우 parameterType 속성을 생략한다.
 


DML 명령(INSERT, UPDATE, DELETE) 관련 엘리먼트는 등록된 SQL 명령을 DBMS 서버에 전달하여 실행한 후 조작행의 갯수(int)를 무조건 정수값으로 매핑하여 제공하므로 resultType 속성을 생략한다. 
 


[mybatis-config.xml] 에서 typeAlias 설정 

<typeAliases>
	<typeAlias type="xyz.itwill.dto.Mymember" alias="MyMember"/>
</typeAliases>

 
parameterType 속성값으로 전달된 값을 SQL 명령에서 #{변수명|필드명|맵키} 형식으로 표현하여 전달값을 제공받아 사용한다.
parameterType 속성값으로 전달된 값이 Java 객체(DTO)인 경우 #{필드명} 형식으로 객체 필드값을 제공받아 사용하면 된다. - Getter 메소드가 자동 호출됨


참고) ibatis 프레임워크에서는 전달값을 #변수명|필드명|맵키# 형식으로 표현한다.

 

<?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">
	<!-- Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용 -->
	<insert id="insertMyMember" parameterType="MyMember">
		insert into mymember values(#{id}, #{name}, #{phone}, #{email})
	</insert>
</mapper>

 
 
update : UPDATE 명령을 등록하기 위한 엘리먼트

<update id="updateMember" parameterType="MyMember">
	update mymember set name=#{name}, phone=#{phone}, email=#{email} where id=#{id}
</update>

 
delete : DELETE 명령을 등록하기 위한 엘리먼트
 
parameterType 속성값으로 값 하나만 전달받은 경우 #{변수명} 형식으로 표현하여 전달값을 제공받아 사용한다. - 변수명은 어떤 이름을 표현하여 사용하든지 상관 없다.

<delete id="deleteMember" parameterType="string">
	delete from mymember where id=#{id}
	<!-- delete from mymember where id=#{xx} => 변수명 상관 X -->
</delete>

 
select : SELECT 명령을 등록하기 위한 엘리먼트
→ resultType 속성 또는 resultMap 속성을 반드시 설정해야만 매핑 정보를 제공받아 사용할 수 있다.
 - resultType 속성 : 검색행을 Java 객체로 제공하기 위한 Java 자료형을 속성값으로 설정한다.
    → Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용이 가능하다.
 
resultType 속성값으로 클래스를 설정한 경우 속성값으로 설정된 클래스의 객체를 생성하여 검색행의 컬럼값을 컬럼과 같은 이름의 객체 필드에 저장하여 제공한다. - 자동매핑 

<select id="selectMember" parameterType="string" resultType="MyMember">
		select id, name, phone, email from mymember where id=#{id}
	</select>
	
	<!-- SELECT 명령으로 다수행이 검색되어도 resultType 속성에는 하나의 검색행을 객체로 매핑하기
	위한 Java 자료형을 속성값으로 설정해주면 된다. -->
	<select id="selectMemberList" resultType="MyMember">
		select * from mymember order by id
	</select>

 
전체 코드

<?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">
	<!-- Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용 -->
	<insert id="insertMyMember" 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 id, name, phone, email from mymember where id=#{id}
	</select>
	
	<!-- SELECT 명령으로 다수행이 검색되어도 resultType 속성에는 하나의 검색행을 객체로 매핑하기
	위한 Java 자료형을 속성값으로 설정해주면 된다. -->
	<select id="selectMemberList" resultType="MyMember">
		select * from mymember order by id
	</select>
</mapper>

 


 
DAO 선언
 
[MyMemberXMLDAO.java]
 


회원정보를 전달받아 MYMEMBER 테이블의 회원정보로 삽입하고 삽입행의 갯수를 반환하는 메소드 선언
 
SqlSession.insert(String elementId[, Object parameterValue]) : 매퍼에 등록된 insert 엘리먼트의 SQL 명령(INSERT)을 제공받아 DBMS 서버에 전달하여 실행하고 삽입행의 갯수를 제공받아 반환하는 메소드
→ elementId : SQL 명령이 등록된 매퍼와 엘리먼트의 식별자를 문자열로 표현하여 전달
→ parameterValue : SQL 명령 작성에 필요한 값(객체)를 전달 - parameterType 속성값으로 전달 
→ SQL 명령 작성에 필요한 값(객체)이 없는 경우 parameterValue 매개변수에 값 미전달
 
mybatis 프레임워크는 기본적으로 AutoCommit 기능을 비활성화 처리하고 SQL 명령을 DBMS 서버에 전달하여 실행한다. 
따라서 DML 명령을 전달하여 실행한 경우 반드시 커밋 또는 롤백 처리를 해주어야 한다.
 
sqlSession.commit() : 트랜잭션 적용 명령(COMMIT)을 DBMS 서버에 전달하여 실행한다. (커밋 처리)
sqlSession.rollback() : 트랜잭션 취소 명령(ROLLBACK)을 DBMS 서버에 전달하여 실행한다. (롤백 처리)
 

	public int insertMember(MyMember member) {
		SqlSession sqlSession=getSqlSessionFactory().openSession();
		try {
			//SQL 명령(INSERT)를 제고압ㄷ아 DBMS 서버에 전달하여 실행하고 삽입행의 갯수를 반환
			int rows=sqlSession.insert("MyMemberXMLMapper.insertMember", member);
			
			//DML 명령을 전달하여 실행한 경우 반드시 커밋 또는 롤백 처리
			if(rows > 0) {
				sqlSession.commit();//커밋처리
			} else {
				sqlSession.rollback();//롤백처리
			}
			
			return rows;
		} finally {
			sqlSession.close();
		}
	}

 
 
회원정보를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 변경하고 변경행의 갯수를 반환하는 메소드
 
SqlSessionFactory.openSession(boolean autoCommit) : SqlSession 객체를 생성하여 반환하는 메소드
→ false : AutoCommit 기능 비활성화(기본값), true : AutoCommit 기능 활성화 
 
SqlSession.update(String elementId[, Object parameterValue]) : 매퍼에 등록된 update엘리먼트의 SQL 명령(UPDATE)을 제공받아 DBMS 서버에 전달하여 실행하고 변경행의 갯수를 제공받아 반환하는 메소드

	public int updateMember(MyMember member) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.update("MyMemberXMLMapper.updateMember", member);
		} finally {
			sqlSession.close();
		}
	}

 
 
아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 삭제하고 삭제행의 갯수를 반환하는 메소드
 
SqlSession.delete(String elementId[, Object parameterValue]) : 매퍼에 등록된 delete엘리먼트의 SQL 명령(DELETE)을 제공받아 DBMS 서버에 전달하여 실행하고 삭제행의 갯수를 제공받아 반환하는 메소드

	public int deleteMember(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.update("MyMemberXMLMapper.deleteMember", id);
		} finally {
			sqlSession.close();
		}
	}

 
아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 검색하여 DTO 객체로 반환하는 메소드
 
SqlSession.selectOne(String elementId[, Object parameterValue]) : 매퍼에 등록된 select 엘리먼트의 SQL 명령(SELECT)을 제공받아 DBMS 서버에 전달하여 실행하고 검색결과가 저장된 객체(값)를 제공받아 반환하는 메소드
→ 하나의 행만 검색하는 SELECT 명령을 DBMS 서버에 전달하여 실행할 경우 호출하는 메소드 
 

public MyMember selectMember(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.selectOne("MyMemberXMLMapper.selectMember", id);
		} finally {
			sqlSession.close();
		}
	}

 
 
MYMEMBER 테이블에 저장된 모든 회원정보를 검색하여 List 객체로 반환하는 메소드
 
SqlSession.selectOne(String elementId[, Object parameterValue]) : 매퍼에 등록된 select 엘리먼트의 SQL 명령(SELECT)을 제공받아 DBMS 서버에 전달하여 실행하고 검색결과가 저장된 List 객체를 제공받아 반환하는 메소드
→ 여러개의 행을 검색하는 SELECT 명령을 DBMS 서버에 전달하여 실행할 경우 호출하는 메소드 
 

	public List<MyMember> selectMemberList() {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.selectList("MyMemberXMLMapper.selectMemberList");
		} finally {
			sqlSession.close();
		}
	}

 
 
전체

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;
	
	public 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) {//mybatis 환경설정파일이 없는 경우 예외 발생
			throw new IllegalArgumentException();
		}
		return new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	//회원정보를 전달받아 MYMEMBER 테이블의 회원정보로 삽입하고 삽입행의 갯수를 반환하는 메소드
	public int insertMember(MyMember member) {
		SqlSession sqlSession=getSqlSessionFactory().openSession();
		try {
			//SQL 명령(INSERT)를 제공받아 DBMS 서버에 전달하여 실행하고 삽입행의 갯수를 반환
			int rows=sqlSession.insert("MyMemberXMLMapper.insertMember", member);
			
			//DML 명령을 전달하여 실행한 경우 반드시 커밋 또는 롤백 처리
			if(rows > 0) {
				sqlSession.commit();//커밋처리
			} else {
				sqlSession.rollback();//롤백처리
			}
			
			return rows;
		} finally {
			sqlSession.close();
		}
	}
	
	//회원정보를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 변경하고 변경행의 갯수를 반환하는 메소드
	public int updateMember(MyMember member) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.update("MyMemberXMLMapper.updateMember", member);
		} finally {
			sqlSession.close();
		}
	}
	//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 삭제하고 삭제행의 갯수를 반환하는 메소드
	public int deleteMember(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.update("MyMemberXMLMapper.deleteMember", id);
		} finally {
			sqlSession.close();
		}
	}
	//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 검색하여 DTO 객체로 반환하는 메소드
	public MyMember selectMember(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.selectOne("MyMemberXMLMapper.selectMember", id);
		} finally {
			sqlSession.close();
		}
	}
	
	//MYMEMBER 테이블에 저장된 모든 회원정보를 검색하여 List 객체로 반환하는 메소드
	public List<MyMember> selectMemberList() {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.selectList("MyMemberXMLMapper.selectMemberList");
		} finally {
			sqlSession.close();
		}
	}
}

 


jsp 만들어서 확인
 
 


이번엔 인터페이스 기반의 매퍼 파일을 생성해보자
 
 
먼저 [mybatis-config.xml] 에서  매퍼파일을 등록한다
 
class 속성 : Interface 기반의 매퍼 파일의 경로를 속성값으로 설정한다.
Interface 기반의 매퍼 파일의 경로는 Java 자료형(인터페이스)을 기반으로 표현하여 작성한다.

<mappers>
	<mapper class="xyz.itwill.mapper.MyMemberInterfaceMapper"/>
</mappers>

MyMemberInterfaceMapper 인터페이스를 선언해보자
 
 
mybatis 프레임워크에서는 인터페이스를 이용하여 매퍼 파일을 작성할 수 있다.
추상메소드에 mybatis 어노테이션(Annotation)을 사용하여 SQL 명령을 작성하여 등록할 수 있다. 
 
 
@Insert : 추상메소드에 INSERT 명령을 등록하기 위한 어노테이션
 - vlaue 속성 : 추상메소드에 등록될 SQL 명령을 속성값으로 설정한다.
 → value 속성 외에 다른 속성이 없는 경우 속성값만 설정이 가능하다.

@Insert(value="insert into mymember values(#{id}, #{name}, #{phone}, #{email})")
//추상메소드의 매개변수에서 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 id, name, phone, email from mymember where id=#{id}")
int selectMember(String id);
	
@Select("select id, name, phone, email * from mymember order by id}")
List<MyMember> selectMemberList();

 
 
전체 소스코드

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

 


이제 MyMemberInterfaceDAO 에서 메소드를 선언해준다.
 
 
SqlSession.getMapper(Class<T> clazz) : 매개변수의 메모리에 저장된 인터페이스(Class 객체 - Clazz)를 전달받아 Mapper 객체로 생성하여 반환하는 메소드
→ 매개변수에 [XXX.class] 형식으로 인터페이스를 Class 객체로 직접 표현하여 전달 
Mapper 객체 : 인터페이스 기반의 매퍼 파일을 제공받아 Mapper 객체로 생성되며 추상메소드를 호출하여 추상메소드에 등록된 SQL 명령을 DBMS 서버에 전달하여 실행하고 실행결과를 Java 객체로 매핑하여 반환하는 기능을 제공하는 객체 
 

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 {
			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 테이블에 저장된 회원정보를 검색하여 DTO 객체로 반환하는 메소드
	public MyMember selectMember(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberInterfaceMapper.class).selectMember(id);
		} finally {
			sqlSession.close();
		}
	}

	//MYMEMBER 테이블에 저장된 모든 회원정보를 검색하여 List 객체로 반환하는 메소드
	public List<MyMember> selectMemberList() {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberInterfaceMapper.class).selectMemberList();
		} finally {
			sqlSession.close();
		}
	}
}

 


jsp 문서로 잘 동작되는지 확인