반응형

SQL과 Java 객체를 연결하는 지속성 프레임워크이다.

이전에는 iBATIS라는 이름으로 Apache 프로젝트의 하나로 개발되고 이었다. 그러나 2010년 6월에 Apache 소프트웨어 재단에서 개발이 중단되어 현재는 MyBatis라는 이름으로 개발되고 있다.

SQL 문을 완전히 제어하고 싶을 때 사용하면 편하다.



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

idvalue
1hoge
2fuga
3pjyo

폴더 구성

.
├── 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)

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

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

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


반응형

'MyBatis' 카테고리의 다른 글

[MyBatis] 등록 INSERT  (1) 2017.12.31
[MyBatis] 검색 결과를 임의의 Java 오브젝트에 매핑  (0) 2017.12.31
[MyBatis] 검색 SELECT  (0) 2017.12.31
[MyBatis] 실행되는 SQL을 로그에 출력  (0) 2017.12.31
[MyBatis] 설정 파일  (0) 2017.12.31
[MyBatis] MyBatis란?  (0) 2017.12.31

+ Recent posts