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

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

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

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

なお、

* mybatis-spring-boot-starterの使い方については、[こちら](http://qiita.com/kazuki43zoo/items/ea79e206d7c2e990e478)（バージョン2.0対応済）
* mybatis-spring-boot-starter 1.2から1.3の変更点については、[こちら](https://qiita.com/kazuki43zoo/items/3f94d2049d331f81e6f5)
* mybatis-spring-boot-starter 1.1から1.2の変更点については、[こちら](http://qiita.com/kazuki43zoo/items/84b4a89846a7d0d65922)
* mybatis-spring-boot-starter 1.0から1.1の変更点については、[こちら](http://qiita.com/kazuki43zoo/items/5c46ac2f539d365aa53b)

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

> **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` インタフェースを実装しているクラスだけをタイプエイリアスに登録する場合は、

```properties:src/main/resources/application.properties
mybatis.type-aliases-package=com.example
mybatis.type-aliases-super-type=com.example.data.Entity
```

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

# インジェクション可能な`DataSource`が１つの時のみ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`](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html#boot-features-custom-starter-module-autoconfigure)は、Auto-Configureクラスのアノテーション情報（Auto-Configureに必要なメタ情報）をコンパイル時に事前に読み取ってプロパティファイルへ出力しておくことで、Spring Boot実行時にメタ情報をクラスから読み込む処理を省いてアプリケーション起動時間を早めることを目的としてアーティファクトです。
バージョン1.3.xではこの仕組みを利用していませんでしたが、バージョン2.0よりこの仕組みを利用してメタ情報をプロパティファイルへ出力するように改善しています。

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

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

具体的には・・・

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

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

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

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

<div/>

> **Important:**
> **バージョン2.0.1を適用すると、ワイルドカード指定の有無にかかわらず「[タイプエイリアスをスキャンする際に重複エラーが発生する不具合](https://github.com/mybatis/spring/issues/362)」が報告されているので、アップデートする際に注意が必要になります。** なお、無条件でエラーが発生するわけではなく、スキャン対象のパッケージ配下に以下の条件をみたすクラス・インタフェースが存在すると、重複エラーになることがわかっています。
>  
> * 無名オブジェクトを複数利用している
> * 同じ名前のインタフェース・クラス・内部クラスが複数ある
>
> この事象は、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` などに対して同様の対応が行われていたものをフィードバックしたものです。

```java:バージョン2.0.1以降でのJUnit5テストケースクラスの作成例
@MybatisTest
class MyMapperTest {
  // ...
}
```

```java:参考：バージョン2.0.0以前でのJUnit5テストケースクラスの作成例
@ExtendWith(SpringExtension.class) // バージョン2.0.1以降ではこの指定は不要
@MybatisTest
class MyMapperTest {
  // ...
}
```