본문 바로가기
Language/Java

[Java] 마이바티스 MyBatis

Writer mintparc 2019. 12. 25.

마이바티스 MyBatis


마이바티스란 자바의 데이터 베이스 프로그래밍을 좀 더 간편하게 할 수 있도록 도와주는 개발 프레임워크*이다. JDBC를 통해 데이터 베이스에 액세스 하는 작업을 캡슐화하고 일반 SQL 쿼리, 저장 프로시저 및 고급 매핑을 지원하여 모든 JDBC 코드 및 매개변수의 중복 작업을 제거한다. 프로그램 코드와 SQL 쿼리가 완전히 분리되어 코드가 간결해지고 유지보수성이 향상된다는 장점이 있다.

 

* 개발 프레임 워크란 개발자가 원하는 기능 구현에만 집중하여 빠르게 개발할 수 있도록 기본적으로 필요한 기능을 갖추고 있는 것으로 라이브러리가 포함되어 있다. 개발자는 프레임 워크가 정의해 놓은 규칙을 준수하며 사용해야 한다. 

 

 

 

마이바티스 사용하기


마이바티스를 사용하기 위해서는 JAR파일을 클래스 패스에 두어야 한다. 

아래의 링크로 접속하면 JAR파일 다운로드할 수 있는 깃허브 링크가 있다.

 

https://mybatis.org/mybatis-3/ko/getting-started.html

 

MyBatis – 마이바티스 3 | 시작하기

이제부터 다룰 스코프와 생명주기에 대해서 이해하는 것은 매우 중요하다. 스코프와 생명주기를 잘못 사용하는 것은 다양한 동시성 문제를 야기할 수 있다. 의존성 삽입 프레임워크는 쓰레드에 안전하도록 해준다. 트랜잭션 성질을 가지는 SqlSessions과 매퍼들 그리고 그것들을 직접 빈에 삽입하면 생명주기에 대해 기억하지 않아도 되게 해준다. DI프레임워크와 마이바티스를 사용하기 위해 좀더 많은 정보를 보기 위해서는 MyBatis-Spring이나 MyBatis

mybatis.org

 

 

PROPERTIES 파일 : db.properties


DB에 대한 연결 정보를 파일로 저장해놓고 사용하기 위해. properties 파일을 만든다.

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
username=hr
password=hr

 

 

 

XML 설정파일 : mybatis-config.xml


  • 매핑 설정 파일 경로
  • DB 연결 (URL, USER, PASSWORD) : db.properties 파일 연결
  • 사용할 모델 클래스들의 별칭
<?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-->
  <properties resource="com/db/db.properties"></properties>
  
  <!--클래스 별칭-->
  <typeAliases>
	 <typeAlias type="com.model.dto.TESTDto" alias="TESTDto" />
  </typeAliases>

  <!--DB연결-->
  <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="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
  
</configuration>

 

 

매핑 설정 파일 : mybatis-mapper.xml


  • SQL 쿼리 정의
<?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="org.mybatis.example.BlogMapper">

  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
  
</mapper>

 

 

SqlSessionFactory 빌드


  • SqlSessionFactory 인스턴스 사용
  • XML설정파일 연결
public class SqlMapConfig {

	private SqlSessionFactory sqlSessionFactory;
	
	public SqlSessionFactory getSqlSessionFactory() {
		
		String resource = "com/db/mybatis-config.xml";
		Reader reader = null;
		
		try {
			reader = Resources.getResourceAsReader(resource);
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return sqlSessionFactory;
	}
}

 

 

DAO 작성


public class MDBoardDao extends SqlMapConfig{

	public List<TESTDto> selectList(){
		SqlSession session = null;
		List<TESTDto> list = null;
		
		try {
			session = getSqlSessionFactory().openSession();
			list = session.selectList("selectList");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}
		
		return list;
	}

	public int insert(TESTDto dto) {
		SqlSession session = null;
		int res = 0;
		try {
			session = getSqlSessionFactory().openSession();
			res = session.insert("com.db.mapper.insert", dto);
			if(res > 0) {
				session.commit();
			}
		}catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}
		return res;
	}
    
    	public int update(TESTDto dto) {
		SqlSession session = null;
		int res = 0;
		try {
			session = getSqlSessionFactory().openSession();
			res = session.update("com.db.mapper.update", dto);
			if(res > 0) {
				session.commit();
			}
		}catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}

		return res;
	}
	
	public int delete(int seq) {
		SqlSession session = null;
		int res = 0;
		try {
			session = getSqlSessionFactory().openSession();
			res = session.delete("com.db.mapper.delete", seq);
			if(res > 0) {
				session.commit();
			}
		}catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}

		return res;
	}

}

댓글