Fork me on GitHub

MyBatis与SpringBoot的结合及代码分析

MyBatis提供了MyBatis-Spring-Boot-Starter项目用于MyBatis与SpringBoot的整合。充分利用了SpringBoot自动配置的优点,使用起来非常方便。我们来看一下简单的使用:

MyBatis-Spring-Boot-Starter的简单使用

首先引入MyBatis-Spring-Boot-Starter的包,以maven为例:

1
2
3
4
5
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>

接着在application.yml文件中加入mybatis相关的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
spring:
datasource:
name: test
url: jdbc:mysql://127.0.0.1:3306/mytest
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
druid:
filters: stat
pool-prepared-statements: true
max-open-prepared-statements: 20
max-active: 20
initial-size: 1
max-wait: 60000
min-idle: 1
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: select 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false

mybatis:
mapper-locations: classpath:mapping/*.xml
type-aliases-package: love.wangqi.springmybatisdemo.model
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

经过以上两步,我们就配置好了Mybatis,然后就可以正常使用Mybatis了:加入UserMapper.UserMapper.xml,在UserService中注入UserMapper

MyBatis-Spring-Boot-Starter的探究

经过SpringBoot自动配置探究的分析,我们知道了SpringBoot自动配置的原理。根据其原理我们来探究一下MyBatis-Spring-Boot-Starter是如何工作的。

首先我们看到,mybatis-spring-boot-starter的pom文件引入了5个包,分别是:spring-boot-starter, spring-boot-starter-jdbc, mybatis-spring-boot-autoconfigure, mybatis, mybatis-spring。

mybatis-spring-boot-autoconfigure是自动配置的关键,查看它底下的文件,看到了META-INF/spring.factories,其中定义了EnableAutoConfiguration,为org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

MybatisAutoConfiguration这个类实际上代替了我们在Mybatis-Spring中Config类中的各种配置。查看其代码我们发现似曾相识。

它首先通过@EnableConfigurationProperties(MybatisProperties.class)注解注入了我们在application.yml文件中定义的Mybatis的各种配置。

然后定义了SqlSessionFactory, SqlSessionTemplate以及一个名为AutoConfiguredMapperScannerRegistrar的类,这个类继承了ImportBeanDefinitionRegistrar,在registerBeanDefinitions方法中扫描并注册各个Mapper类的BeanDefinition。