MyBatis | MyBatis란 | Hello World


설치

build.gradle

compile 'org.mybatis:mybatis:3.3.0'
compile 'mysql:mysql-connector-java:5.1.38'

데이터베이스 준비

여기서는 MySQL 5.5.28을 사용한다.

test_table

id value
1 hoge
2 fuga
3 pjyo

폴더 구성

.
├── src/main/
├── java
│   └── sample/mybatis/
│       └── Main.java
├── resources
│       ├── mybatis-config.xml
│       └── sample_mapper.xml
└── build.gradle

설정 파일

mybatis-config.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>
  <environments default="sample_id">
    <environment id="sample_id">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/test"/>
        <property name="username" value="test"/>
        <property name="password" value="test"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="sample_mapper.xml"/>
  </mappers>
</configuration>

sample_mapper.xml

<?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="sample.mybatis">
  <select id="selectTest" resultType="map">
    select * from test_table
  </select>
</mapper>

구현

Main.java

package sample.mybatis;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

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

public class Main {

    public static void main(String[] args) throws Exception {
        // 루트가 되는 설정 파일을 로드한다.
        try (InputStream in = Main.class.getResourceAsStream("/mybatis-config.xml")) {
            //  설정 파일을 바탕으로 SqlSessionFactory를 생성한다.
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

            // SqlSessionFactory에서 SqlSession을 생성한다.
            try (SqlSession session = factory.openSession()) {
                // SqlSession을 사용하여 SQL을 실행한다.
                List<Map<String, Object>> result = session.selectList("sample.mybatis.selectTest");

                result.forEach(row -> {
                    System.out.println("---------------");
                    row.forEach((columnName, value) -> {
                        System.out.printf("columnName=%s, value=%s%n", columnName, value);
                    });
                });
            }
        }
    }
}

실행 결과

---------------
columnName=id, value=1
columnName=value, value=hoge
---------------
columnName=id, value=2
columnName=value, value=fuga
---------------
columnName=id, value=3
columnName=value, value=piyo

설명

설정 파일

  • 첫째, 데이터베이스 연결 정보 등을 정의하는 기본이 되는 설정 파일을 준비한다(mybatis-config.xml).
  • 그런 다음 SQL 문장과 검색 결과의 매핑 방법 등을 정의한 파일을 준비한다(sample_mapper.xml).

구현

  • 먼저, SqlSessionFactoryBuilder를 사용하여 설정 파일(mybatis-config.xml)을 읽는다.
  • SqlSessionFactory를 사용하여 SqlSession을 생성한다.
  • SqlSession에 포함되어 있는 SQL 실행을 위한 메소드를 사용하여 SQL 실행한다(selectList()).
  • 첫 번째 인수는 실행할 SQL을 식별하는 ID (스테이트먼트 ID)를 지정한다.
  • 스테이트먼트 ID와 반환 형식은 sample_mapper.xml에서 정의된 정보를 바탕으로 하고 있다.

각 인스턴스의 권장 범위(scope)

인스턴스 설명 권장 범위
SqlSessionFactoryBuilder SqlSessionFactory를 만들면 끝이다. 메소드 범위
SqlSessionFactory 한번 만들면, 그것을 사용하도록 한다. 응용 프로그램 범위
SqlSession 비 스레드 안전. 일련의 SQL 실행이 끝나면 닫는다. 요청 범위
Mapper 인스턴스 SqlSession과 동일해야 하지만, 좀 더 짧은 범위가 좋다. 메소드 범위

Mapper에 대해서는 나중에 설명하겠다

  • 메소드 범위
    • 메소드 내에서만 사용하고 버린다.
  • 요청 범위
    • Web 응용 프로그램에서 하나의 요청 동안만 동일한 인스턴스를 사용한다.
    • 다른 요청에서 참조하지 않도록 한다.
  • 응용 프로그램 범위
    • 응용 프로그램이 실행되는 동안 계속 같은 인스턴스를 사용한다.