MyBatis Spring Boot Starter 2.1的变更点
我总结了2019年7月15日发布的2.1版本的变更内容。
这个变更中,不再支持已经到达了生命周期终点的Spring Boot 2.0.x,需要升级到Spring Boot 2.1以上版本。
此外,
-
- mybatis-spring-boot-starterの使い方については、こちら(バージョン2.1対応済)
-
- mybatis-spring-boot-starter 1.3から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の変更点については、こちら
请根据需要进行调整并查看。
顺便提一下,mybatis-spring-boot-starter 2.0.x的维护基本上将终止(如果报告了致命的bug之后才考虑提供修补程序,但基本上建议升级版本)。
此外,针对Spring Boot 1.5.x(Spring Framework 4.3.x)的维护将在版本1.3.x上继续进行,但由于已经宣布了将于2019年8月停止对Spring Boot 1.5.x的支持,预计1.3.x的维护也将在同一时期结束(即计划发布1.3.5版本并结束维护)。
由于有报告称这个版本存在缺陷,所以如果遇到与缺陷发生条件一致的情况,需要应用避免措施。关于这个缺陷,将在预计于2019年10月中旬发布的mybatis-spring-boot-starter 2.1.1(mybtis-spring 2.0.3)中进行修复。(2019/7/21添加)
Class を引数にとるコンストラクタを使ってインスタンスを生成するTypeHandlerをパッケージ指定でスキャンすることができない(詳細は「gh-370」と「mybatis-spring/gh-394」を参照)
必需版本的依赖库
-
- MyBatis 3.5+
-
- Mybatis-Spring 2.0+
- Spring Boot 2.1+
Java所需的最低版本
- Java 8+
依赖库的版本更新
在2.1版本中,以下库的版本已进行更新。
Spring Boot2.0.9.RELEASE2.1.6.RELEASETravisCIで2.2.0-SNAPSHOTを使用したテストも実施済
自动检测语言驱动程序
我们支持了自动检测 DI 容器中注册的 LanguageDriver 并将其应用到 MyBatis 的机制。
通过这个改进,开发者可以通过以下方式将自己创建的 LanguageDriver 类应用到 MyBatis,即通过 Bean 定义。
@Bean
MyLanguageDriver myLanguageDriver() {
return MyLanguageDriver();
}
另外,如果从DI容器中检测到的LanguageDriver的Bean只有一个,那么检测到的LanguageDriver将被视为默认的LanguageDriver类(如果检测到多个Bean,则将应用MyBatis的默认设置XMLLanguageDriver)。如果您不想通过自动检测功能来更改默认的LanguageDriver类,或者在同时使用多个LanguageDriver时要更改默认的LanguageDriver类,则可以使用以下介绍的mybatis.default-scripting-language-driver属性(在2.1版本中添加的属性)来明确指定默认的LanguageDriver类。
添加mybatis.default-scripting-language-driver
在2.0版本之前,我们提供了mybatis.configuration.default-scripting-language属性来指定默认使用的LanguageDriver类的方法(该属性用于将值直接设置给MyBatis提供的配置类),但是当与后述的”LanguageDriver的自动配置支持”相结合时,可能会出现不符合预期的结果,因此我们已废除(禁止使用)该属性,并新增了mybatis.default-scripting-language-driver选项。
mybatis.default-scripting-language-driver={デフォルトのLanguageDriverクラスのFQCN}
对LanguageDriver的自动配置的支持。
我已对MyBatis的以下3个子模块(LanguageDriver)添加了自动配置机制的支持。
-
- mybatis-velocity
-
- mybatis-freemarker
- mybatis-thymeleaf
当将上述的三个子模块的jar文件添加到类路径中后,子模块提供的LanguageDriver类的Bean将自动注册到DI容器并应用于MyBatis。请注意,如果开发人员明确定义了来自上述子模块提供的LanguageDriver类的Bean定义,将不会进行自动配置。
警告:
如果以下条件全部符合,由于失去兼容性,将需要额外的措施。
1. 上述三个子模块(mybatis-velocity,mybatis-freemarker,mybatis-thymeleaf)的jar只有一个在类路径上。
2. 默认的LanguageDriver不是由子模块提供的LanguageDriver。如果符合以上条件,由于子模块提供的LanguageDriver类被设置为默认的LanguageDriver机制,因此需要明确指定默认的LanguageDriver如下所示:
mybatis.default-scripting-language-driver={默认的LanguageDriver类的FQCN}
使用 MyBatis Velocity
当添加以下工件时,将应用org.mybatis.scripting.velocity.VelocityLanguageDriver(如果指定mybatis-velocity 2.0之前的版本,则应用org.mybatis.scripting.velocity.Driver)到MyBatis。
<!-- Mybatis Velocityを利用する場合 -->
<dependency>
<groupId>org.mybatis.scripting</groupId>
<artifactId>mybatis-velocity</artifactId>
<version>2.1.0</version>
</dependency>
如果使用MyBatis-velocity 2.1.0及更高版本,则可以利用配置属性机制来自定义MyBatis Velocity和其中使用的Velocity模板引擎的操作。
#
# mybatis.scripting-language-driver.velocity.{key} = {value} 形式
#
# Velocity本体の動作をカスタマイズするプロパティ
# mybatis.scripting-language-driver.velocity.velocity-settings.{name} = {value}形式
# {name}に設定可能なプロパティはリファレンスドキュメントを参照してください。
mybatis.scripting-language-driver.velocity.velocity-settings.runtime.custom_directives = com.example.directives.MyDirective
# テンプレートエンジンに渡す追加属性(オブジェクト)を指定するプロパティ
# mybatis.scripting-language-driver.velocity.additional-context-attributes.{name} = {value}
mybatis.scripting-language-driver.velocity.additional-context-attributes.likeEscape = com.example.helpers.LikeEscape
使用MyBatis FreeMarker
添加以下的工具包,将org.mybatis.scripting.freemarker.FreeMarkerLanguageDriver应用到MyBatis中。
<dependency>
<groupId>org.mybatis.scripting</groupId>
<artifactId>mybatis-freemarker</artifactId>
<version>1.2.0</version>
</dependency>
如果使用MyBatis-velocity 1.2.0或更高版本,您可以利用配置属性机制来自定义MyBatis FreeMarker和MyBatis FreeMarker内部使用的FreeMarker模板引擎的行为。
#
# mybatis.scripting-language-driver.freemarker.{key} = {value} 形式
#
# FreeMarker本体の動作をカスタマイズするプロパティ
# mybatis.scripting-language-driver.freemarker.freemarker-settings.{name} = {value}形式
# {name}に設定可能なプロパティはリファレンスドキュメントを参照してください。
mybatis.scripting-language-driver.freemarker.freemarker-settings.interpolation_syntax = dollar
# MyBatis FreeMarkerの動作をカスタマイズするプロパティ
# mybatis.scripting-language-driver.freemarker.{name} = {value}
# {name}に設定可能なプロパティはリファレンスドキュメントを参照してください。
mybatis.scripting-language-driver.freemarker.template-file.base-dir = sql
使用 MyBatis Thymeleaf
添加以下工件时,将org.mybatis.scripting.thymeleaf.ThymeleafLanguageDriver应用于MyBatis。
<dependency>
<groupId>org.mybatis.scripting</groupId>
<artifactId>mybatis-thymeleaf</artifactId>
<version>1.0.1</version>
</dependency>
可以使用配置属性机制来自定义MyBatis Thymeleaf和MyBatis Thymeleaf中使用的Thymeleaf模板引擎的操作。
#
# mybatis.scripting-language-driver.thymeleaf.{key} = {value} 形式
#
# MyBatis Thymeleafの動作をカスタマイズするプロパティ
# mybatis.scripting-language-driver.thymeleaf.{name} = {value}
# {name}に設定可能なプロパティはリファレンスドキュメントを参照してください。
mybatis.scripting-language-driver.thymeleaf.use2way = false
mybatis.scripting-language-driver.thymeleaf.template-file.cache-enabled = false
mybatis.scripting-language-driver.thymeleaf.dialect.like-additional-escape-target-chars = %, _
对于Mapper的延迟初始化控制的支持
我们增加了一个选项来控制在DI容器初始化时(通过注入或使用时)注册的Mapper的初始化时机。默认情况下,所有的Mapper都会在DI容器初始化时进行初始化。
在Spring Boot 2.2(到目前为止尚未发布正式版)中启用了延迟初始化机制,可以在特定条件下导致在调用Mappr方法时出现错误,因此添加了对Mapper的延迟初始化适用与否的控制权,以便用户可以在使用方面进行控制。如果只是为了避免错误,则只需将延迟初始化对Mapper的适用性无条件禁用即可,但我认为在开发(测试)时延迟初始化机制是有效的,因此MyBatis(mybatis-spring和mybatis-spring-boot-starter)独立地实现了对Mapper的延迟初始化的控制。请参阅有关“在mybatis-spring-boot 2.1.0中添加的mybatis.lazy-initialization”以获取更多详细信息。
请注意:
本版本中所提供的延迟初始化机制是MyBatis(mybatis-spring 和 mybatis-spring-boot-starter)独有的机制,因此也可以在Spring Boot 2.1系列中使用。
自动检测 TypeHandler
我们已经支持了一种机制,可以自动检测在DI容器中注册的TypeHandler并将其应用到MyBatis中。
通过这项改进,开发者可以通过以下方式将他们自己创建的TypeHandler类应用到MyBatis中。
@Bean
MyTypeHandler myTypeHandler() {
return MyTypeHandler();
}
在禁用Mapper扫描时,需要向MapperScannerConfigurer中添加条件。
如果开发人员明确地将 Mapper 注册到 DI 容器中进行定义,mybatis-spring-boot-start 将禁用 Mapper 的自动扫描。在2.0版本之前,当满足以下条件之一时自动扫描将被禁用。
-
- コンフィギュレーションクラスに@MapperScanを指定
-
- XMLコンフィギュレーションにを指定
MapperFactoryBeanのBeanを定義
在2.1版本中,除了上述的内容之外,
MapperScannerConfigurerのBeanを定義
当执行时,Mapper的自动扫描将被禁用。
修复扫描类型别名时出现重复错误的问题。
在2.0.1版本中,mybatis-spring存在一个 bug,即在特定条件下会出现“扫描类型别名时出现重复错误”的问题。但在2.1.0版本中,该问题已经在依赖的mybatis-spring 2.0.2中修复。
在@MybatisTest中添加属性properties。
我在@MybatisTest中添加了一个属性(properties),用于指定@MybatisTest中的属性(key=value形式)。通过这个改变,如果在测试时只想应用特定的属性,就不需要再使用@TestPropertySource了。值得注意的是,这个改变是基于Spring Boot 2.1中添加到@JdbcTest的机制,并反馈到了@MybatisTest中。
@MybatisTest(properties = {
"logging.level.org.springframework.jdbc=debug",
"spring.datasource.schema=classpath:TodoMapperTests/schema.sql"
})
public class TodoMapperTests {
// ...
}
将文档的源文件从XDOC转换成Markdown
使用Maven Site插件将生成的参考文档的源文件从XDOC格式更改为Markdown格式。由于仅更改了源文件的格式,因此文档的内容基本上是相同的(除了应用了2.1.0支持的更改部分以外都相同)… “源代码的代码突出显示”已经消失了(这是Markdown使用时的限制吗?还是插件的使用方式不正确?目前正在调查中)。
通过这种处理,构建后的文档中的代码高亮功能消失了。但是,通过将文档转换为Markdown格式,可以通过GitHub来引用最新的文档(即快照版本的文档)。为了优先考虑这种优点,我们已经将XDOC格式更改为Markdown格式。
-
- mybatis-spring-boot-autoconfigure
- mybatis-spring-boot-test-autoconfigure
添加简易样本
在2.1版本中,为了增加集成测试的完善性,我们还增加了样本的多样性。