MyBatis

MyBatis

- JDBC 프레임워크의 일종

- SQL 파일과 java 파일을 분리

- Connection Pool 개념 사용

※Connection Pool : 연결 자원을 미리 생성하여 연결 시 호출하여 사용하는 방식, 연결 자체의 양이 한정 되어 있음


기존의 java 에서의 DB링크가 SQL과 java 코드와 혼재한 것과 다르게 각각 분리되어 있음


※사용법


1. Maven project의 pom.xml 파일의 <dependencies> 태그 내부에 아래 링크의 <dependency> 태그를 삽입(<dependencies> 태그가 없는 경우 직접 생성)

사용한 Maven-Mybatis 링크


2.  config.xml 파일을 생성 하여 DB와 연결

<mappers> 내부의 <mapper>태그는 사용할 mapper(실제 사용될 sql 구문이 있는 파일)로 설정해야 함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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>
  <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="sql 구문이 있는 xml 파일 경로"/>
  </mappers>
</configuration>
cs


3. 실행할 sql 구문이 있는 xml 파일 생성

1
2
3
4
5
6
7
8
9
<?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/delete/insert/... id="식별 id" resultType="반환 타입" parameterType="입력 인자 타입">
    sql 구문
  </select>
</mapper>
cs

※주의 사항
- sql 구문에서 입력 받는 인자 값은 다음과 같이 표기
ex) select * from emp where emp_id = #{emp_id}

- 입력 받는 인자 값은 반드시 하나만 가능하므로, 다수의 값 전달 시 별도의 VO가 필요
- 반환 값이 여러 개라면, list 형태로 반환함
- commit은 자동으로 실행됨


4. connection pool 생성을 위한 SqlSessionManager.java 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.database;
 
import java.io.InputStream;
 
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 
public class SqlSessionManager {
    // Connection Pool
    // SqlSessionFactory : SQL 연결을 만들어내고, 가지고있는 객체
    private static SqlSessionFactory sqlSessionFactory;
 
    // 초기화 블럭 : 프로그램 시작시 static 변수들이 할당되자마자 실행
    static {
        try {
            // resource -> config.xml 파일의 경로
            String resource = "com/database/config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    // 다른 DAO 파일에서 sqlSessionFactory를 꺼낼 수 있도록하는
    // Getter
    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}
 
cs


5. DAO를 통한 SQL 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package kr.smhrd.model;
 
import java.util.List;
 
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
 
import kr.smhrd.mapper.SQLSessionManager;
 
public class BoardDAO {
    //동적로딩-> Mybatis의 경우 필요 x
    //connection 객체 생성
    
    //Connection pool 가져오기
    SqlSessionFactory sqlsessionfactory = SQLSessionManager.getSqlSessionFactory();
    
    //SQL문 실행 준비
    
    //글 전체를 가져오는 메서드
    public List<BoardVO> boardList() {
        
        //1. SqlSession 빌려오기
        //행값 변화가 있는 경우 필요 : openSession(auto commit)
        SqlSession session = sqlsessionfactory.openSession(true);
        
        //2.sql문 실행
        //delete, insert, update : 똑같은 이름의 메소드 사용
        //select : 1) selectOne : select문의 결과가 하나
        //           2) selectList : select 문의 결과가 다수
        
        //?(바인드 변수)가 있는 경우 : selectList(String 타입 id 값, parameter : 바인드 변수) VO
        //?(바인드 변수)가 없는 경우 : selectList(String 타입 id 값) -> List<VO>
        
        //BoardMapper의 sql 쿼리와 연동
        List<BoardVO> list = session.selectList("boardlist");
        
        //3. 빌려온 session 반환
        session.close();
        
        //4.쿼리 실행 결과 리턴
        return list;
    }
    
                                        . . .
    
}
cs

※주의 사항
-session.sql유형별 메소드("mapper 식별 id")

유형별 메소드  : selectOne, selectList, delete, insert, update 등
mapper 식별 id 는 반드시 존재하는 mapper에 정의한 sql의 식별 id와 일치해야함

-session open/close는 반드시 쌍으로 실행되어야함

댓글