Spring BootとMyBatisで複数のDBを扱うためのapplication.properties作成方法

2016/07/26

Spring Bootで複数のDataSourceを扱う方法は、使用するORMによってだけでなく、Springのconfigurationをapplication.properties/application.ymlで行うかJavaConfigで行うかによっても変わってくる。
ここではMyBatisとapplication.propertiesでの方法を書く。
ちなみにMyBatisを選んだのは直接SQLを書きたいからで、application.propertiesを選んだのは(ymlでもいいが)JavaConfigより設定が一か所にまとまり、さらに.javaファイルよりも「このファイルは設定である」と一目でわかるのが簡潔に思うから。

検証version
・Spring Boot 1.3.3
・MyBatis 3.3.1
・MyBatis-Spring 1.2.4

目次

今回の設定における前提
pom.xml
ディレクトリ構造
ソースコード解説

今回の設定における前提

・DBは二つ接続したい。
 一つは自システム専用のDBで、もう一つは他システムのDB。
 それぞれownとotherというDB名とする。
・ownにはCustomerテーブル、otherにはOrderテーブルがある。

pom.xml

Spring BootにMyBatisを組み込むためのライブラリの設定。
pom.xml

mybatis-spring-boot-starterが提供されているので、これだけでMyBatis本体とMyBatis-Springが入ってくれる。

ディレクトリ構造

DB接続部分のディレクトリ構造の抜粋

ディレクトリごとの役割解説

ディレクトリ 役割
domain 検索結果に相当するJavaBeansをおく。
mapper 直下にDBごとのディレクトリを作成し、SQLを記載したxmlを呼び出すためのinterfaceをおく。
ディレクトリを分けるということ以外、Javaソース上でDBの違いは意識しなくて済む。
service mapper interfaceを呼び出したり、ビジネスロジックを書く。DBの違いはここでは意識しなくて済む。
system/config/db DBに関係する設定。パラメータ設定をapplication.propertiesで行えるようにするためのコードが書かれている。

ソースコード解説

ディレクトリごとの役割解説で記載した通り、DBごとの違いが現れるのはsystem/config/dbのソースだけであり、あとは単一DBで使用するときと変わらない。
※ただし、Application.javaにはAnnotationの変更が入る。
まずはsystem/config/dbの各クラスについて全文掲載していく。

DataSource.java

Tomcatのorg.apache.tomcat.jdbc.pool.DataSourceを独自拡張している。
Spring Bootでは/src/main/resourcesにschema.sqlとdata.sqlを配置することで、アプリの起動時に自動でSQLを実行してくれる機能がある。また以下のようにファイル名を指定することで、デフォルトのファイル名から変更することもできる。

しかしorg.apache.tomcat.jdbc.pool.DataSourceには同パラメータがないため、schemaとdataというフィールドを持つように拡張している。

OwnDBProperties.java

ownDB用にapplication.properiesでspring.ownをkeyに各種設定をできるようにしている。
@ConfigurationPropertiesをクラスに付与すると、@ConfigurationPropertiesの引数で指定した値がapplication.properiesでkeyとして使える。
DataSourceクラスで定義されているものを、各種keyとして使用したいので、@NestedConfigurationPropertyをDataSourceに付与することで、spring.own.datasourceというprefixで各種項目にアクセスできるようになる。

OtherDBProperties.java

spring.otherをapplication.propertiesで使用できるようにする。基本はOwnDBPropertiesと同じ。

OwnDataSourceConfiguration.java

ownDB用に以下のクラスを構築するJavaConfig。
・DataSource
・MyBatisが使用するSqlSessionTemplate
・Spring Boot起動時のSQLファイル自動実行用のDataSourceInitializer

JavaConfigなので、@Configurationをクラスに付与する。
また@MapperScanで、ownDBにSQLアクセスするmapper interface群が格納されているpackageの指定と、SqlSessionTemplateがどのインスタンスを参照すればいいかを指定する。

OtherDataSourceConfiguration.java

otherDB用。各種名称、参照がownからotherになっている以外はOwnDataSourceConfiguration.javaと同じ。

以上で、application.propertiesで複数DataSourceの設定が行えるようになった。
次はApplication.javaでのAnnotationの要変更箇所を見ていく。

Application.java

Spring Bootアプリとして実行するために、Application.javaで@SpringBootApplicationを付与しているが、@SpringBootApplicationが付与されていると自動的にDataSource関連の設定を行ってくれる。
しかし、その設定を行ってくれるクラスDataSourceAutoConfiguration.classは単一DBの設定を前提としているため、@SpringBootApplicationのexcludeに設定することで、DataSourceAutoConfiguration.classが動かないようにしている。

@EnableConfigurationPropertiesは、@ConfigurationPropertiesを付与されたbeansが働くようにするために必要な設定である。
今回独自に追加したOwnDBProperties.class, OtherDBProperties.classを設定するのに加え、本来DataSourceAutoConfiguration.classで設定されていたデフォルトのDataSourceProperties.classも設定する。

Javaのコード部分は以上で終わりとなる。
最後に/src/main/resourcesを見ていく。

CustomerMapper.xml

xmlファイルで注意する点はが指定するmapper interfaceがどのディレクトリにあるかということだけ。
jp.co.sample.mapper.own.CustomerMapperが正解で、jp.co.sample.mapper.CustomerMapperやjp.co.sample.mapper.other.CustomerMapperというように格納されているディレクトリ名をコピペで処理して間違えないようにしなければいけない。

mybatis-config.xml

mybatis-config.xmlは複数DBになったことによる影響はない。理由は今回についてはdomainディレクトリ以下をownとotherで分けなかったため、typeAliasesのpackage nameに影響がなかったから。
domain以下もディレクトリを分けるのであれば、mybatis-config-own.xmlとmybatis-config-other.xmlの二つに分けるのが良いと思う。そしてmybatis-configのファイルパス指定をapplication.propertiesで行うのではなく、OwnDataSourceConfiguration、OtherDataSourceConfigurationで直指定すればいい。

application.properties

-Java
-,