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

2017年1月2日のリリースされた1.2の変更点をまとめました。

なお、

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

をご覧下さい。

> **Note:**
>
> **2017/4/10: 追記**
> バージョン1.2.1の変更点を追加しました。
>
> **2017/8/21: 追記**
> バージョン1.2.2の変更点を追加しました。

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

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

* MyBatis 3.4+
* Mybatis-Spring 1.3+
* Spring 4.3+

# Spring 4.3+(Spring Boot 1.4+)が必須

バージョン1.2では、Spring 4.3から追加された`ObjectProvider`を利用して自動コンフィギュレーションを行うようになっているため、Spring 4.3ベースのSpring Boot 1.4+が必須になります。
なお、Mapperファイルの読み込み時にワイルドカード(例：`mybatis.mapper-locations=classpath*:**/mapper/*.xml`)を使用している場合は、Spring Boot 1.4.3+(Spring 4.3.5+)を使わないとMapperファイルが重複して読み込む不具合に遭遇する可能性があります([gh-108](https://github.com/mybatis/spring-boot-starter/issues/108))。

> **Note:**
> Spring 4.2(Spring Boot 1.3)上で使う場合は、バージョン1.1.1を利用してください。

# ライブラリバージョン

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

| ライブラリ名 | 1.1.1のバージョン | 1.2.0のバージョン | 1.2.1のバージョン | 1.2.2のバージョン |
| --------- | --------------- | -------------- | --------------- | --------------- |
| MyBatis | 3.4.0 | 3.4.2 | 3.4.4 | 3.4.5 |
| MyBatis Spring | 1.3.0 | 1.3.1 | 1.3.1 | 1.3.1 |
| Spring Boot | 1.3.3.RELEASE | 1.4.3.RELEASE | 1.4.5.RELEASE | 1.4.7.RELEASE |

# アーティファクトの依存構造

バージョン1.2では、`mybatis-spring-boot-starter`及び`mybatis-spring-boot-autoconfigure`の依存構造の見直しが行われています。これは、Spring Bootのコアコミッターの一人である[Stéphane Nicoll](https://github.com/snicoll)氏からの指摘を受けての対応になります。

具体的には・・・バージョン1.1では、

```
[INFO] +- org.mybatis.spring.boot:mybatis-spring-boot-starter:jar:1.1.1:compile
[INFO] |  \- org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:jar:1.1.1:compile
[INFO] |     +- org.mybatis:mybatis:jar:3.4.0:compile
[INFO] |     +- org.mybatis:mybatis-spring:jar:1.3.0:compile
[INFO] |     +- org.springframework.boot:spring-boot:jar:1.4.3.RELEASE:compile
[INFO] |     |  \- org.springframework:spring-context:jar:4.3.5.RELEASE:compile
[INFO] |     |     +- org.springframework:spring-aop:jar:4.3.5.RELEASE:compile
[INFO] |     |     +- org.springframework:spring-beans:jar:4.3.5.RELEASE:compile
[INFO] |     |     \- org.springframework:spring-expression:jar:4.3.5.RELEASE:compile
[INFO] |     +- org.springframework.boot:spring-boot-autoconfigure:jar:1.4.3.RELEASE:compile
[INFO] |     \- org.springframework.boot:spring-boot-starter-jdbc:jar:1.4.3.RELEASE:compile
[INFO] |        +- org.springframework.boot:spring-boot-starter:jar:1.4.3.RELEASE:compile
[INFO] |        |  +- org.springframework.boot:spring-boot-starter-logging:jar:1.4.3.RELEASE:compile
[INFO] |        |  |  +- ch.qos.logback:logback-classic:jar:1.1.8:compile
[INFO] |        |  |  |  \- ch.qos.logback:logback-core:jar:1.1.8:compile
[INFO] |        |  |  +- org.slf4j:jcl-over-slf4j:jar:1.7.22:compile
[INFO] |        |  |  +- org.slf4j:jul-to-slf4j:jar:1.7.22:compile
[INFO] |        |  |  \- org.slf4j:log4j-over-slf4j:jar:1.7.22:compile
[INFO] |        |  \- org.yaml:snakeyaml:jar:1.17:runtime
[INFO] |        +- org.apache.tomcat:tomcat-jdbc:jar:8.5.6:compile
[INFO] |        |  \- org.apache.tomcat:tomcat-juli:jar:8.5.6:compile
[INFO] |        \- org.springframework:spring-jdbc:jar:4.3.5.RELEASE:compile
[INFO] |           \- org.springframework:spring-tx:jar:4.3.5.RELEASE:compile
```

となっていたところが、バージョン1.2では、

```
[INFO] +- org.mybatis.spring.boot:mybatis-spring-boot-starter:jar:1.2.0:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter:jar:1.4.3.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot:jar:1.4.3.RELEASE:compile
[INFO] |  |  |  \- org.springframework:spring-context:jar:4.3.5.RELEASE:compile
[INFO] |  |  |     +- org.springframework:spring-aop:jar:4.3.5.RELEASE:compile
[INFO] |  |  |     \- org.springframework:spring-expression:jar:4.3.5.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-autoconfigure:jar:1.4.3.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:1.4.3.RELEASE:compile
[INFO] |  |  |  +- ch.qos.logback:logback-classic:jar:1.1.8:compile
[INFO] |  |  |  |  \- ch.qos.logback:logback-core:jar:1.1.8:compile
[INFO] |  |  |  +- org.slf4j:jcl-over-slf4j:jar:1.7.22:compile
[INFO] |  |  |  +- org.slf4j:jul-to-slf4j:jar:1.7.22:compile
[INFO] |  |  |  \- org.slf4j:log4j-over-slf4j:jar:1.7.22:compile
[INFO] |  |  \- org.yaml:snakeyaml:jar:1.17:runtime
[INFO] |  +- org.springframework.boot:spring-boot-starter-jdbc:jar:1.4.3.RELEASE:compile
[INFO] |  |  +- org.apache.tomcat:tomcat-jdbc:jar:8.5.6:compile
[INFO] |  |  |  \- org.apache.tomcat:tomcat-juli:jar:8.5.6:compile
[INFO] |  |  \- org.springframework:spring-jdbc:jar:4.3.5.RELEASE:compile
[INFO] |  |     +- org.springframework:spring-beans:jar:4.3.5.RELEASE:compile
[INFO] |  |     \- org.springframework:spring-tx:jar:4.3.5.RELEASE:compile
[INFO] |  +- org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:jar:1.2.0:compile
[INFO] |  +- org.mybatis:mybatis:jar:3.4.2:compile
[INFO] |  \- org.mybatis:mybatis-spring:jar:1.3.1:compile
```

になっています。
何が変わったかというと・・・、バージョン1.1では、`mybatis-spring-boot-starter`は`mybatis-spring-boot-autoconfigure`だけに依存し、`mybatis-spring-boot-autoconfigure`がMyBatis, MyBatis-Spring, Spring Bootとの依存関係をもっていました。一見すると問題ないように見えますが、実質的に`mybatis-spring-boot-autoconfigure`がStarterの役割もになっており、この部分がSpring Bootが提供するStarterとAutoConfigureの考え方と異なるよ!!ってことでした。

これは・・・AutoConfigureのアーティファクト**だけ**を追加した場合に、Spring Bootアプリケーションに副作用が出ないようにする（自動コンフィギュレーションが働かない状態にする）べきで、自動コンフィギュレーションを有効にするために必要となる依存ライブラリ群を一発で解決する役割がStarterだよね！！ってことみたいです。

> **Warning:**
> 依存アーティファクトとして`mybatis-spring-boot-starter`を指定している場合はこの変更の影響をうけることはありませんが、もし`mybatis-spring-boot-autoconfigure`の方を指定している場合は、バージョン1.2を使う際に`mybatis-spring-boot-starter`を指定するように変更してください。


# `mybatis.configuration-properties`の追加

バージョン1.2より、プレースホルダ(`${キー名}`)に置き換える値を指定するための新しいプロパティ（`mybatis.configuration-properties`）が追加されました。プレースホルダは、MyBatis設定ファイル、Mapper XMLファイル、SQL定義の置換変数、一部アノテーションの値の中で使うことができます。

プロパティで指定可能な形式は、

```properties
mybatis.configuration-properties.キー名=キー値
````

で・・・例えば、

```properties:src/main/resources/application.properties
mybatis.configuration-properties.db.schema=prod
```

と定義することで`${db.schema}`といった感じで参照することができます。

これは・・・MyBatis設定ファイルで表現すると、

```xml:mybatis-config.xml
<properties>
    <property name="db.schema" value="prod" />
</properties>
```

MyBatis Springが提供している`org.mybatis.spring.SqlSessionFactoryBean`を使って表現すると、

```java
@Bean
SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
    SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
    factoryBean.setDataSource(dataSource);
    Properties props = new Properties();
    props.setProperty("db.schema", "prod");
    factoryBean.setConfigurationProperties(props);
    return factoryBean;
}
```

or

```xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configurationProperties">
        <props>
            <prop key="db.schema">prod</prop> 
        </props>
    </property>
</bean>
```

になります。

> **Note:**
> 実は・・・バージョン1.1.1でも、以下のように定義することで同じことが実現できます。この方法はバージョン1.2でも使うことができ、同じキー名がある場合はバージョン1.2で追加された`mybatis.configuration-properties`で指定した値が優先されます。
>
> ```properties:src/main/resources/application.properties
> mybatis.configuration.variables.db.schema=prod
> ```
>
> たとえば・・・`mybatis.configuration.variables`には環境依存しない値（or デフォルト値）を定義しておき、プロファイル毎（環境毎）のプロパティファイルで`mybatis.configuration-properties`を使用して環境依存値に上書きするといった使い方もできます。


# `mybatis.configuration`配下のプロパティキーとIDEの連携

バージョン1.1から`org.apache.ibatis.session.Configuration`をコンフィギュレーションするためのプロパティ(`mybatis.configuration.*`)がサポートされましたが、STSやIntelliJ IDEAなどのIDE上でプロパティキーが補完対象になっていませんでした。この不具合がバージョン1.2で解消されます。

> **Note:**
> ただし・・・今度はプロパティキーが重複するという別の問題([gh-127](https://github.com/mybatis/spring-boot-starter/issues/127))が・・・
> これは、ビルド時に使用している`maven-bundle-plugin`の不具合のようで、バージョン1.2.1で解決される予定です。
>
> **2017/4/10: 追記**
> プロパティキーが重複する問題はバージョン1.2.1で解決されました！！

# `ConfigurationCustomizer`インタフェースの追加

[バージョン1.3の変更点](http://qiita.com/kazuki43zoo/items/3f94d2049d331f81e6f5#configurationcustomizer%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%81%AE%E8%BF%BD%E5%8A%A0)を参照してください。

# `@MybatisTest`(mybatis-spring-boot-starter-test)の追加

[バージョン1.3の変更点](http://qiita.com/kazuki43zoo/items/3f94d2049d331f81e6f5#mybatistestmybatis-spring-boot-starter-test%E3%81%AE%E8%BF%BD%E5%8A%A0)を参照してください。