MyBatis | 설정 파일 | 여러 데이터베이스 연결 정의

데이터베이스 연결 정보는 environment라는 단위로 정의한다. SqlSessionFactory이 environment 단위로 인스턴스를 생성하게 된다.

기본적으로 <environments> 태그의 default 속성에 지정된 environment가 사용된다. 그러나 SqlSessionFactory를 생성할 때 임의의 environment를 지정할 수도 있다.

데이터 테이블

test_table@hoge 스키마

id value
1 fizz
2 buzz

test_table@fuga 스키마

id value
1 hoge
2 fuga
3 piyo

소스 코드

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="hoge"> <!-- hoge을 기존으로 설정 -->
    <environment id="hoge">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/hoge"/>
        <property name="username" value="test"/>
        <property name="password" value="test"/>
      </dataSource>
    </environment>

    <environment id="fuga">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/fuga"/>
        <property name="username" value="test"/>
        <property name="password" value="test"/>
      </dataSource>
    </environment>
  </environments>

  <mappers>
    <mapper resource="sample_mapper.xml"/>
  </mappers>
</configuration>

Main.java

package sample.mybatis;

import java.io.InputStream;
import java.util.function.Function;

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 {
        execute(in -> new SqlSessionFactoryBuilder().build(in)); // environment을 지정하지 않았다.
        execute(in -> new SqlSessionFactoryBuilder().build(in, "fuga")); // environment을 지정했다.
    }

    private static void execute(Function<InputStream, SqlSessionFactory> sqlSessionFactorySupplier) throws Exception {
        try (InputStream in = Main.class.getResourceAsStream("/mybatis-config.xml")) {
            SqlSessionFactory factory = sqlSessionFactorySupplier.apply(in);

            try (SqlSession session = factory.openSession()) {
                System.out.println(session.selectList("sample.mybatis.selectTest"));
            }
        }
        System.out.println();
    }
}

실행 결과

[{id=1, value=fizz}, {id=2, value=buzz}]
[{id=1, value=hoge}, {id=2, value=fuga}, {id=3, value=piyo}]

설명

  • SqlSessionFactoryBuilder#build()의 두 번째 인수로, environment를 지정할 수 있다.