본문 바로가기

MyBatis/Download & Setup

MyBatis Download & Setup

MyBatis 설치 및 실행 테스트 절차


Download


Setup


Reference Book

Google 에서 배포하는 MyBatis 학습서 ( Acorn MyBatis Book )

https://code.google.com/p/mybatis-example/downloads/list


mybatis-3.2.6.pdf

MyBatis-3-User-Guide_ko.pdf




Docs for MyBatis



MyBatis Example



테스트 환경

MyBatis-3.2.6, JDK 1.7, Eclipse(Kepler), Tomcat 7, Oracle 11g XE



개요

Object Relational Mapping (ORM) 툴 중에서 MyBatis 를 사용하는 간단한 예제를 작성하여 MyBatis 에 대한 전체적인 개념을 애해하는데 도움이 되고자 한다

Oracle 11g XE 에서 SCOTT 계정과 EMP 테이블을 생성하고 MyBatis를 이용하여 전체 사원정보를 가져오는 예제를 작성한다.

분리된 SQL문장과 Java 코드를 연결하는 방법은 XML 방식과 Annotation 방식이 있는데 여기서는 일반적으로 사용되는 XML 연결방식을 사용한다



1. Eclipse에서 Dynamic Web Project 생성

   - WebContent/WEB-INF/lib/ 안에 MyBatis-3.2.6.jar 파일을 복사한다

   - Java Resources/src/ 안에 emp 라는 패키지를 생성한다

   - 위에서 생성한 emp 패키지에 모든 MyBatis 설정파일과 Java 클래스를 생성할 것이다



2. emp 패키지에 db.properties 파일을 다음과 같이 생성한다. 이 파일은 데이터베이스에 연결하기 위한 모든 정보를 제공한다

   위의 Reference Book 항목에 첨부된 한글 매뉴얼의 10 페이지를 참고하여 다음과 같이 데이터베이스 연결정보를 작성한다

driver=oracle.jdbc.OracleDriver

url=jdbc:oracle:thin:@localhost:1521:XE

username=scott

password=tiger



3. emp 패키지에 Emp.java 을 생성하여 모델 오브젝트로 사용하려고 한다

package emp;


public class Emp {

private int empno;

private String ename;

private int deptno;

private String job;

public int getEmpno() {

return empno;

}

public void setEmpno(int empno) {

this.empno = empno;

}

public String getEname() {

return ename;

}

public void setEname(String ename) {

this.ename = ename;

}

public int getDeptno() {

return deptno;

}

public void setDeptno(int deptno) {

this.deptno = deptno;

}

public String getJob() {

return job;

}

public void setJob(String job) {

this.job = job;

}

}



4. emp 패키지에 EmpMapper.java 를 생성한다. 데이터베이스 코드이며 개발자가 정의한 아래의 interface MyBatis 측에서 구현하여 구체적인 클래스가 완성될 때 메소드 내에 비로소 SQL문장이 포함된다

package emp;


import java.util.List;


public interface EmpMapper {


public List<Emp> getAllEmp();

        public List<HashMap<String,String>> getList(@Param("rowsPerPage")int rowsPerPage, @Param("currPage")int currPage);

public int insert(Emp emp);

public int modify(Emp emp);

public int delete(int empno);

public Emp getEmp(int empno);

}


위의 선언에서 파라미터가 기본형(String형 포함)이고 다수개인 경우에는 인터페이스 파일에서 파라미터에 @Param() 을 사용하여 이름을 지정하고 SQL문장에서 사용할 수 있으며, 메소드의 파라미터 타입이 기본형 데이터 1개인 경우에는 SQL 파일에서 parameterType 속성을 설정하지 않아도 됨.


5. emp 패키지에 EmpMapper.xml 을 생성한다. 지정된 인터페이스가 구체적인 클래스로 구현될 때, SQL문장의 id 와 메소드 이름이 동일하면 메소드가 구현되면서 그 안에 SQL 문장이 포함된다. 위에 첨부된 한글 매뉴얼의 20 페이지를 참고하여 아래와 같은 내용을 작성한다

  • SELECT 문장에는 반드시 resultType 속성을 사용해야 하며, 자바표준 빈 클래스hashMap 을 값으로 사용할 수 있다
  • SELECT 문장 실행결과 다수 행이 선택된 경우에는 각행을 resultType에 저장하고 List 에 모든 행을 저장하여 리턴한다

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="emp.EmpMapper">


<select id="getAllEmp" resultType="Emp">

   SELECT empno,ename,deptno,job 

   FROM emp2 

   ORDER BY empno

</select>

<select id="getList" resultType="hashMap">

SELECT rn, empno, ename, page, ttpage, ttcnt FROM 

(

SELECT

T1.*,

ROWNUM rn,

FLOOR((ROWNUM-1)/#{rowsPerPage}) AS page,

FLOOR((ttcnt-1)/#{rowsPerPage}) AS ttpage FROM

(

SELECT e.*,COUNT(*)OVER() AS ttcnt FROM emp e ORDER BY empno

) T1

) WHERE page=#{currPage}

</select>


<insert id="insert" parameterType="Emp">

INSERT INTO emp2 VALUES (#{empno}, #{ename}, #{deptno}, #{job})

</insert>

<update id="modify" parameterType="Emp">

UPDATE emp2 SET deptno=#{deptno}, job=#{job} WHERE empno=#{empno}

</update>

<delete id="deleteparameterType="int">

DELETE FROM emp2 WHERE empno=#{empno}

</delete>

<select id="getEmp" resultType="Emp">

SELECT empno, ename, deptno, job FROM emp2 WHERE empno=#{empno}

</select>

</mapper>


위의 내용에서 파라미터가 기본형이고 다수개인 경우에는 인터페이스 파일에서 파라미터에 @Param() 을 사용하여 이름을 지정하고 SQL문장에서 사용할 수 있음



6. emp 패키지에 Configuration.xml 파일을 생성한다

<?xml version="1.0" encoding="UTF-8" ?>


<!DOCTYPE configuration 

PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 

"http://mybatis.org/dtd/mybatis-3-config.dtd">


<configuration>

<properties resource="emp/db.properties" />


<typeAliases>

<typeAlias type="emp.Emp" alias="Emp" />

</typeAliases>


<environments default="development">

<environment id="development">

<transactionManager type="JDBC" />

<dataSource type="POOLED">

<property name="driver" value="${driver}" />

<property name="url" value="${url}" />

<property name="username" value="${username}" />

<property name="password" value="${password}" />

</dataSource>

</environment>

</environments>

<mappers>

<mapper resource="emp/EmpMapper.xml" />

</mappers>


</configuration>



7. emp 패키지에 EmpMybatisDAO.java 파일을 생성한다 ( 한글 매뉴얼 9 페이지 참조 )

package emp;


import java.io.IOException;

import java.io.Reader;

import java.util.ArrayList;

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;


public class EmpMybatisDAO { // 싱글턴을 적용하여 SqlSessionFactory 인스턴스가 1개만 생성되도록 한다

private static EmpMybatisDAO instance = new EmpMybatisDAO();


private String resource = "emp/Configuration.xml"; //DB 연결정보, DB인터페이스, SQL문장, 모델클래스 정보

private Reader reader;

private SqlSessionFactory sqlMapper;  // 애플리케이션 스코프에서 한번만 생성해야 하므로 싱글턴을 사용할 필요가 있다

public static EmpMybatisDAO getInstance() {

return instance;

}

private EmpMybatisDAO() {

try {

reader = Resources.getResourceAsReader(resource);

sqlMapper = new SqlSessionFactoryBuilder().build(reader);

} catch (IOException e) {

e.printStackTrace();

}

}

public List<Emp> getAllEmp() {

List<Emp> emps = null;

SqlSession session = sqlMapper.openSession(); // SqlSession 메소드 스코프에서 생성/사용되어야 한다

try {

EmpMapper mapper = session.getMapper(EmpMapper.class); //DB인터페이스 객체생성

emps = mapper.getAllEmp();

//session.commit();

} finally {

session.close();

}

return emps;

}


public List<HashMap<String,String>> getList(int currPage) {

List<HashMap<String,String>> list = null;

SqlSession session = sqlMapper.openSession();

try {

EmpMapper mapper = session.getMapper(EmpMapper.class);

list = mapper.getList(3,1);

//session.commit();

} finally {

session.close();

}

return list;

}


public Emp getEmp(int empno) {

Emp emp = null;

SqlSession session = sqlMapper.openSession();

try {

EmpMapper mapper = session.getMapper(EmpMapper.class);

emp = mapper.getEmp(empno);

//session.commit();

} finally {

session.close();

}

return emp;

}


public boolean insert(Emp emp) {

boolean result = false;

SqlSession session = sqlMapper.openSession();

try {

EmpMapper mapper = session.getMapper(EmpMapper.class);

int rows = mapper.insert(emp);

                        result = rows > 0 ? true : false;

session.commit();

} finally {

session.close();

}

return result;

}


        public boolean modify(Emp emp) {

boolean result = false;

SqlSession session = sqlMapper.openSession();

try {

EmpMapper mapper = session.getMapper(EmpMapper.class);

int rows = mapper.modify(emp);

                        result = rows > 0 ? true : false;

session.commit();

} finally {

session.close();

}

return result;

}

public boolean delete(int empno) {

boolean result = false;

SqlSession session = sqlMapper.openSession();

try {

EmpMapper mapper = session.getMapper(EmpMapper.class);

int rows = mapper.delete(empno);

                        result = rows > 0 ? true : false;

session.commit();

} finally {

session.close();

}

return result;

}

}