JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
■応用の森 Spring Boot 複数のJDBCデータソースに接続する
■応用の森 SpringMVC編 No004」で紹介した、複数JDBCデータソース接続の Spring Boot版のご紹介です。

ご承知の通り、Spring Bootでは、XML設定ファイルが使えないため、Configクラスでの設定となります。
今回は、「■Spring Boot の小径 4-6)MyBatisによるDB連携」で説明した
MybatisConfig.javaを改造することで実現していますので、まずこちらを理解している前提で話を進めます。
使用するDBの環境や、Mapperインターフェース、MapperXMLも
■応用の森 SpringMVC編 No004」と全く同じものを使用します。
では、まずJDBCドライバ接続情報ファイルですが、
■Spring Boot の小径 4-6)MyBatisによるDB連携」では、
application.propertiesを使用しましたが、今回は、application.ymlを使うことにしました。
理由は特にありませんが、強いて言うなら自分自身がまだ修行中の身で、「色々やってみる!」を座右の銘にしているので
こちらの方法を取り入れてみました。
実際やってみると、複数のデータソースを管理する上ではapplication.ymlの方がタイプ量も少なくて見やすいと思いました。
ではその実体。
src/main/resources/application.yml

見れば一目瞭然と思いますが、2種類のDBに接続するために
primary と secondary のキーワードを付けた接続情報を2種類定義しています。
Spring-MVC編での例に倣ってこちらも同じく、
プライマリDBがPostgreSQL。セカンダリDBが MariaDBという想定です。
あと、「■応用の森 Spring-MVC編 No004」と同じく、
Mybatis設定情報のMapperXMLファイルのロケーションをプライマリ用とセカンダリ用に一段深くしています。
次にここが一番重要な、Configクラスの説明です。
■Spring Boot の小径 4-6)MyBatisによるDB連携」で使った
MybatisConfig.javaを改造します(というか新しく作りなおします)
プライマリ用とセカンダリ用にクラスをそれぞれ分けます。
プライマリ用クラス「src/main/java/jp/dip/arimodoki/config/MybatisPrimaryConfig.java」

セカンダリ用クラス「src/main/java/jp/dip/arimodoki/config/MybatisSecondaryConfig.java」

どちらもやっていることはほとんど同じですが、
@ConfigurationPropertiesアノテーションで、application.ymlから読み込む接続情報を
spring.mybatis.primary / spring.mybatis.secondary で切り分けています。
@MapperScanアノテーションで、Mapperインターフェースのパッケージ階層basePackagesを
primary /secondaryに一段深くしています。
あと、それぞれのメソッドに付与するBeanの名称を、primaryXXXX / secondaryXXXX の様に付与しています。
続いてMapper関連の説明ですが、
ここは「■応用の森 Spring-MVC編 No004」と全く同じで、
プライマリ用:GraphMapper.java、GraphMapper.xml
セカンダリ用:UserMapper.java、UserMapper.xml
で、パッケージ階層をプライマリ用、セカンダリ用に一段深くしたので、それに対する修正を行います。

プライマリ用MapperXML「WebContent/WEB-INF/mappers/primary/GraphMapper.xml」

セカンダリ用MapperXML「WebContent/WEB-INF/mappers/secondary/UserMapper.xml」

それぞれに大きな変更はありませんが、Mapperインタフェースを指定する、
namespaceのパッケージ階層で、primary/secondary が追加されています。

プライマリ用Mapperインターフェース「src/main/java/jp/dip/arimodoki/mapper/primary/GraphMapper.java」

セカンダリ用Mapperインターフェース「src/main/java/jp/dip/arimodoki/mapper/secondary/UserMapper.java」

それぞれに大きな変更はありませんが、インターフェースの配置場所が変わったので、
パッケージ名が修正されています。

最後に、MapperインターフェースをDIするビジネスロジック(サービスロジック)の修正です。

プライマリ用DB処理ビジネスロジック「src/main/java/jp/dip/arimodoki/blogic/BlChartImpl.java」

セカンダリ用DB処理ビジネスロジック「src/main/java/jp/dip/arimodoki/blogic/BlUser.java」

これらも内容に大きな変更はありませんが、Mapperインターフェースのパッケージ階層が変わった事による
import宣言の修正と、あとひとつ重要な修正点として、
@Transactionalアノテーションの使い方ですが、プライマリ用とセカンダリ用Configクラスで
TransactionManagerを分けたので、どちらのTransactionManagerを使うかを指定する必要があります。
プライマリ用のDBを操作するメソッドに、secondaryTransactionManager を指定しても
Transactionは効かないので注意が必要です。
あと、一つのメソッドには一つの@Transactionalアノテーションしか指定できないので、
一つのメソッド内で、プライマリ/セカンダリ両方のDB操作を行う場合のTransactionはできないので、
そういう設計を行わないように注意する必要があります。

それ以外のコントローラ層や、View(HTL)は全く変更する必要はなく、そのまま使用可能です。

説明は以上です。
そして、「■応用の森 Spring-MVC編 No004」と理由は同じく、
説明のみで動作サンプルはありません。
 ※)ちゃんと動くことは確認していますが

■応用の森 Spring-MVC編 No004」でも説明した通り、
元々はすでに解説しているプログラムの改造なので
それぞれ元の説明を見てもらえれば、コントローラやView(HTML)のサンプルも展示してありますので
それらを有効活用して自分なりに挑戦してみてください。

最後になりましたが、
参考にさせていただいたサイトをご紹介しておきます
Spring BootとMyBatisで複数のDBを扱うためのapplication.properties作成方法