SpringBootでMyBatisを利用する方法

SpringBootがORMとして、EclipseLinkなどのJPAフレームワークを使う場合は、
設定が簡単なんですが、MyBatisを利用したい場合に関しては、少し実装してあげる必要があります。
以前のエントリーの方法で、プロジェクトを作成した前提で書きます。chronosdeveloper.hatenablog.com
POMファイルに必要なものを追記します。
Springのトランザクション関連のライブラリとMyBatis関連のライブラリを追加します。

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>${org.springframework.version}</version><!--$NO-MVN-MAN-VER$-->
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-tx</artifactId>
	<version>${org.springframework.version}</version><!--$NO-MVN-MAN-VER$-->
</dependency>
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>${mybatis-spring.version}</version>
</dependency>
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>${org.mybatis.version}</version>
</dependency>	

それが終わったら、通常通りにSpringBootのアプリケーション設定クラスを作成します。

@EnableAutoConfiguration
@ComponentScan
public class ApplicationConfiguration {
}

次にsrc/main/resourcesにapplication.ymlを作成して、データーソースの設定を書きます。
SpringBootが自動的にこのファイルからデーターソースを生成してくれます。

spring:
 datasource:
  username=user
  password=pass
  url=jdbc:oracle:thin:@localhost:1521:xe
  driverClassName=oracle.jdbc.driver.OracleDriver

次にMyBatisの設定用のクラスを作成します。
このクラスにBeanの定義として、SqlSessionFactoryを生成する処理を記述します。
また、MyBatisのMapperScanはAOPの@MapperScanを使います。

@Configuration
@MapperScan(basePackages="persistence.dao") 
public class ApplicationDataSourceConfiguration {
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
		SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
		sessionFactory.setDataSource(dataSource);
		sessionFactory.setConfigLocation(new ClassPathResource("/mapper-config.xml"));
		sessionFactory.setFailFast(true);
        return sessionFactory.getObject();
	}
}

これで準備は完了です。
ちなみに、データーソースの部分に関してですが、
通常は、application.ymlに定義しておけば、自動的に生成してくれますが、
パスワードの暗号化や管理等で、なんらかのライブラリを挟む必要がある場合は、
普通にMyBatisの設定用のクラス内にデーターソースの生成処理を記述することも可能です。

@Configuration
@MapperScan(basePackages="persistence.dao") 
public class ApplicationDataSourceConfiguration {
	@Bean
	public DataSource dataSource() throws SQLException {
		oracle.jdbc.pool.OracleDataSource dataSource = new oracle.jdbc.pool.OracleDataSource();
		dataSource.setUser("datasource.username");
		dataSource.setPassword("datasource.password");
		dataSource.setURL("datasource.url");
		return dataSource;
	}
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
		SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
		sessionFactory.setDataSource(dataSource);
		sessionFactory.setConfigLocation(new ClassPathResource("/mapper-config.xml"));
		sessionFactory.setFailFast(true);
        return sessionFactory.getObject();
	}
}