본문 바로가기
Java Web Programming/6. Spring | MyBatis

[MyBatis] MyBatis 마이바티스 개념과 적용!

by 파프리카_ 2020. 10. 29.
728x90
반응형

[ MyBatis 마이바티스 ] 

: SQL 기반의 Persistence(영속성) Framework

- JDBC Framework!

 

 특징 

  • SQL문과 프로그램 코드의 분리
  • 공통된 JDBC 코드를 MyBatis 가 처리
  • 동적쿼리, 캐시모드 등 다양한 서비스 제공

제공 기능

  • MyBatis 설정 파일 자동생성 
  • 설정 파일 구문 자동완성 기능 제공 
  • 사용하는 곳에서 SQL문 선언 부로 이동 

[  MyBatis 구성요소 역할 – Mapping API ]

  MyBatis API 

  • SqlSessionFactoryBuilder 
    - 역할 : SqlSessionFactory 생성 
  • SqlSessionFactory 
    - MyBatis의 전역 정보를 가지고 실행을 제어 
    - SqlSession 생성 
    - Application당 하나만 생성하는 것이 권장됨 
  • SqlSession 
    - 역할 :  쿼리 실행 처리 
    - 작업 단위 별로 SqlSessionFactory로 부터 생성 

[ MyBatis Framework 의 실행 구조 ]

 


[ MyBatis 사용 환경 설정 ]

 pom.xml에 MyBatis framework 추가

  <dependencies>
	 <!-- MyBatis Framework -->
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis</artifactId>
	    <version>3.4.0</version>
	</dependency>
  </dependencies>

 

src에 MyBatis-Config 디렉토리 추가

 

/SqlSessionConfig.xml

1. MyBatis  DataSource에 대한 설정 및  SQL 정의 xml 에 대한 매핑

2. Spring 연동 시, spring과 연동시에는 spring 설정에서 DataSource(dbcp) 를 정의한다. 

<?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>	
	<!-- 사용할 클래스에 대한 별칭을 명시한다.  -->
	<typeAliases>
		<typeAlias type="model.AccountVO" alias="avo"/>		
	</typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>	
				<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE"/>	
				<property name="username" value="scott"/>	
				<property name="password" value="tiger"/>			
			</dataSource>
		</environment>		
	</environments>
	<mappers>
		<mapper resource="mybatis/config/account.xml"/>	
	</mappers>
</configuration>

 


[ 적용 ]

/account.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Sql Mapper -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="account">
 	<select id="findAccountById" resultType="avo">
 		SELECT *
 		FROM   account
 		WHERE  id=#{value}
 	</select>
 	
	<select id="getAccountList" resultType="avo">
		SELECT   *
		FROM     account
		ORDER BY id DESC
	</select>
</mapper>

/model

 

/AccountVO.java

package model;

public class AccountVO {
	private String id;
	private String name;
	private int balance ;
	
	public AccountVO() {
		super();
	}

	public AccountVO(String id, String name, int balance) {
		super();
		this.id = id;
		this.name = name;
		this.balance = balance;
	}

	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 int getBalance() {
		return balance;
	}

	public void setBalance(int balance) {
		this.balance = balance;
	}

	@Override
	public String toString() {
		return "AccountVO [id=" + id + ", name=" + name + ", balance=" + balance + "]";
	}

}

 

/AccountDAO.java

package model;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import factory.SqlSessionFactoryManager;

// 현재 프로젝트에서는 스프링을 사용하지 않으므로, 
// 싱글톤 패턴을 별도로 적용해줘야한다.
public class AccountDAO {
	private static AccountDAO instance = new AccountDAO();
	// MyBatis Framework를 사용하기 위한 factory 객체
	private SqlSessionFactory factory;
	
	private AccountDAO(){
		//SqlSessionFactoryManager에서 Mybatis 설정파일 로딩 factory 가져옴
		factory = SqlSessionFactoryManager.getInstance().getFactory();
	}
	public static AccountDAO getInstance() {
		return instance;
	}
	
	/**
	 * findAccountById : id로 계좌정보 조회
	 * @param id
	 * @return AccountVO
	 */
	public AccountVO findAccountById(String id) {
		AccountVO vo = null;
		SqlSession session = null;
		
		try {
			session = factory.openSession();
			vo = session.selectOne("account.findAccountById", id);
		} finally {
			session.close();
		}
		
		return vo;
	}
	
	/**
	 * getAccountList : 계좌정보 리스트로 반환받기
	 * @return List<AccountVO>
	 */
	public List<AccountVO> getAccountList() {
		List<AccountVO> list = null;
		SqlSession session = null;
		
		try {
			session = factory.openSession();
			list = session.selectList("account.getAccountList");
		} finally {
			session.close();
		}
		
		return list;
	}
}

/factory

 

/SqlSessionFactoryManager.java

package factory;


import java.io.IOException;
import java.io.Reader;

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

/*
 * Singleton Pattern 적용
 */
public class SqlSessionFactoryManager {
	private static SqlSessionFactoryManager instance = new SqlSessionFactoryManager();
	//MyBatis 객체
	private SqlSessionFactory factory;
	
	private SqlSessionFactoryManager() {
		//MyBatis 설정 파일 로딩할 때 사용하는 API(SqlSessionConfig.xml)
		try {
			Reader r 
				= Resources.getResourceAsReader("mybatis/config/SqlSessionConfig.xml");
			factory = new SqlSessionFactoryBuilder().build(r);
			System.out.println("MyBatis config loading "+factory);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static SqlSessionFactoryManager getInstance() {
		return instance;
	}
	
	public SqlSessionFactory getFactory() {
		return factory;
	}
}

 


/test

 

/TestMyBatis.java

package test;

import java.util.List;

import model.AccountDAO;
import model.AccountVO;

public class TestMyBatis {
	public static void main(String[] args) {
		AccountDAO dao = AccountDAO.getInstance();
		
		//AccountVO로 반환
		String id = "milk";
		AccountVO vo = dao.findAccountById(id);
		
		System.out.println(vo);
		System.out.println("------------------------------------------");
		
		//리스트로 반환
		List<AccountVO> list = dao.getAccountList();
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
	}
}

[ 결과 ] 

 

728x90
반응형