반응형

외부 속성 파일 로드

여러 데이터베이스 연결 정의

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

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

데이터 테이블

test_table@hoge 스키마

idvalue
1fizz
2buzz

test_table@fuga 스키마

idvalue
1hoge
2fuga
3piyo

소스 코드

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를 지정할 수 있다.


Java EE 서버에 관리되는 데이터 소스 사용

Java EE 서버에서 동작하는 경우, 데이터 소스는 서버에 등록해 놓고, 트랜잭션 제어는 Java EE 컨테이너에 맡길 수 있다.

소스코드

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="test">
    <environment id="test">
      <transactionManager type="MANAGED"/> <!-- type을 MANAGED으로 한다-->

      <dataSource type="JNDI"> <!-- JNDI로 한다. -->
        <!-- data_source으로 JNDI부터 조회할 수 있는 이름을 지정한다. -->
        <property name="data_source" value="java:app/sampleDS"/>
      </dataSource>
    </environment>
  </environments>

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

설명

  • <transactionManager> 태그의 type을 MANAGED로 한다.
  • <datasource> 태그의 type를 JNDI으로 한다.
  • <property> 태그으로 data_source를 설정한다.
    • 값은 JNDI를 조회하기 위한 이름으로 한다.




반응형

'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