Edited at

mybatis-spring-boot-starter 2.0の変更点

(だいぶ遅くなりましたが・・・)2019年1月22日のリリースされた2.0の変更点をまとめました


Note:

2019/4に2.0.1がリリース済みなので、内容的には2.0.1の変更点も含みます。


この変更では、目玉になるような大きな機能追加・改善はないため、Spring Boot 2.x(Spring Framework 5.x)以上を必須とした最初のバージョンであるという点がこの変更の目玉となります(地味な改善はいくつか行っていますが・・)。

なお、


  • mybatis-spring-boot-starterの使い方については、こちら(バージョン2.0対応済)

  • mybatis-spring-boot-starter 1.2から1.3の変更点については、こちら

  • mybatis-spring-boot-starter 1.1から1.2の変更点については、こちら

  • mybatis-spring-boot-starter 1.0から1.1の変更点については、こちら

も必要に応じて合わせてご覧下さい。


Note:

ちなみに、Spring Boot 1.5.x(Spring Framework 4.3.x)向けのメンテナンスはバージョン1.3.xで継続していますが、2019/8を目処にSpring Boot 1.5.xがEOLになることがアナウンスされているので、バージョン1.3.xのメンテナンスも同じ時期に終了する予定です(=最後に1.3.5をリリースしてメンテナンスを終了する予定)。



依存ライブラリの必須バージョン

バージョン2.0を使う場合は、以下のバージョンが必須になります。


  • MyBatis 3.5+

  • Mybatis-Spring 2.0+

  • Spring Boot 2.0+


Javaの必須バージョン

バージョン2.0を使う場合は、Java 8以上が必要になります。


依存ライブラリのバージョン更新

バージョン2.0では、以下のライブラリのバージョンが更新されています。

ライブラリ名
1.3.2のバージョン
2.0.0のバージョン
2.0.1のバージョン

MyBatis
3.4.6
3.5.0
3.5.1

MyBatis Spring
1.3.2
2.0.0
2.0.1

Spring Boot
1.5.10.RELEASE
2.0.8.RELEASE
2.0.9.RELEASE


Note:

バージョン2.0.0と同時にリリースされたバージョン1.3.3ではSpring Boot 1.5.19.RELEASE、バージョン2.0.1と同時にリリースされたバージョン1.3.4ではSpring Boot 1.5.20へ更新されています。



コンフギュレーションプロパティでtypeAliasesSuperTypeの指定をサポート

typeAliasesSuperType はSpring MyBatis提供のSqlSessionFactoryBeanでサポートしているオプションで、タイプエイリアスとして登録するクラスを指定パッケージ配下からスキャンする際に、指定したクラス・インタフェースに割り当て可能なクラス(=継承または実装しているクラス)のみをスキャン対象にしたい場合に利用します。

例えば・・・指定したパッケージ配下から com.example.data.Entity インタフェースを実装しているクラスだけをタイプエイリアスに登録する場合は、


src/main/resources/application.properties

mybatis.type-aliases-package=com.example

mybatis.type-aliases-super-type=com.example.data.Entity

という指定にすることで実現することができます。


インジェクション可能なDataSourceが1つの時のみMyBatisのAuto-Configureが有効になるように変更

バージョン1.3.xまでは、プライマリ指定がない状態で複数のDataSourceがDIコンテナに登録されていると(= by typeでのインジェクション候補のDataSourceが複数存在する状態になっていると)、MyBatisのAuto-Configureでエラーになっていましたが、2.0からはMyBatisのAuto-Configureが無効になるように変更が行われています。この変更は、Spring Boot提供のJdbcTemplateのAuto-Configureなどの動作をフィードバックしました。

なお、複数データソースに対するAuto-Configureのサポートについては、機能追加要望としてIssueを作成して頂ければ幸いです(PRも大歓迎です!)。


spring-boot-autoconfigure-processorの適用

spring-boot-autoconfigure-processorは、Auto-Configureクラスのアノテーション情報(Auto-Configureに必要なメタ情報)をコンパイル時に事前に読み取ってプロパティファイルへ出力しておくことで、Spring Boot実行時にメタ情報をクラスから読み込む処理を省いてアプリケーション起動時間を早めることを目的としてアーティファクトです。

バージョン1.3.xではこの仕組みを利用していませんでしたが、バージョン2.0よりこの仕組みを利用してメタ情報をプロパティファイルへ出力するように改善しています。


ベースパッケージ指定時のワイルドカードをサポート

バージョン2.0.1より、コンフィギュレーションプロパティ(mybatis.type-aliases-packagemybatis.type-handlers-package)にて、スキャン対象のベースパッケージを指定する際にワイルドカードを指定することができるようになります。

具体的には・・・

# パッケージの深さを意識したワイルドカード指定

mybatis.type-handlers-package=com.example.*.typehandler

# パッケージの深さを意識しないワイルドカード指定
mybatis.type-handlers-package=com.example.**.typehandler

といった感じの指定が可能になります。


Note:

MyBatis本体はワイルドカードの指定をサポートしていないため、MyBatis本体の設定ファイル(mybatis-config.xml)などに指定するベースパッケージにはワイルドカードを指定することはできません。



Important:

バージョン2.0.1を適用すると、ワイルドカード指定の有無にかかわらず「タイプエイリアスをスキャンする際に重複エラーが発生する不具合」が報告されているので、アップデートする際に注意が必要になります。 なお、無条件でエラーが発生するわけではなく、スキャン対象のパッケージ配下に以下の条件をみたすクラス・インタフェースが存在すると、重複エラーになることがわかっています。


  • 無名オブジェクトを複数利用している

  • 同じ名前のインタフェース・クラス・内部クラスが複数ある

この事象は、MyBatis Spring 2.0.2で修正される予定(2019/7上旬リリース予定)で、MyBatis Spring 2.0.2を取り込んだバージョン2.1.0を2019/7上旬にリリースする予定になっています。なお、 (2019/3でSpring Boot 2.0.xがEOLになることがアナウンスされているため+既にGA対象からも外れているため)バージョン2.0.xにバックポートする予定はありません。本事象を解決するためには、基本的にはバージョン2.1.xへアップデートすることを推奨します。ただし・・・どうしてもバージョン2.1.xへアップデートできない場合は、MyBatis Spring 2.0.2を個別に適応することを検討していただければと思います。



@MybatisTest指定時に @ExtendWith(SpringExtension.class)の指定が不要になる

バージョン2.0.1より、@MybatisTest を付与したJUnit 5のテストケースクラスにて、 @ExtendWith(SpringExtension.class) の指定が不要になります。これは、@MybatisTest 側に @ExtendWith(SpringExtension.class) を付与することで、JUnit 5のフレームワークエンジンが合成アノテーションである @MybatisTest に指定しているアノテーションから情報を読み取ってくれるためです。

この変更は、Spring Boot提供の @SpringBootTest などに対して同様の対応が行われていたものをフィードバックしたものです。


バージョン2.0.1以降でのJUnit5テストケースクラスの作成例

@MybatisTest

class MyMapperTest {
// ...
}


参考:バージョン2.0.0以前でのJUnit5テストケースクラスの作成例

@ExtendWith(SpringExtension.class) // バージョン2.0.1以降ではこの指定は不要

@MybatisTest
class MyMapperTest {
// ...
}