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 piyo

フォルダ構成

.
├── 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 に定義された情報にもとづく。

各インスタンスの推奨スコープ

インスタンス 説明 推奨スコープ
SqlSessionFactoryBuilder SqlSessionFactory を作成したら役割は終わる。 メソッドスコープ
SqlSessionFactory 一度作成したら、それを使い続ける。 アプリケーションスコープ
SqlSession スレッドセーフではない。一連の SQL 実行が終わったら閉じる。 リクエストスコープ
Mapper インスタンス SqlSession と同じでよいが、もう少し短いスコープが望ましい。 メソッドスコープ

Mapper については後で説明する

  • メソッドスコープ
    • メソッド内だけで使用し、使い終わったら破棄する。
  • リクエストスコープ
    • Web アプリケーションで、1つのリクエストの間だけ同じインスタンスを使用する。
    • 他のリクエストから参照されないようにする。
  • アプリケーションスコープ
    • アプリケーションが実行されている間、同じインスタンスを使い続ける。