理解 MyBatis 是如何在 Spring 容器中初始化的,java 上传视频
<artifactId>spring-context-support</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
本文重在演示 MyBatis 的初始化过程,所以没有复杂的 SQL,数据库用的是嵌入式数据库 h2。
然后我们在?com.hyd.mybatis3test?包下面创建一个?SpringMyBatisApplication?类,代码在前面给过了。
对应的 DataSource 初始化实现如下:
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:test");
return dataSource;
}
[](
)2. SqlSessionFactoryBean 初始化
=================================================================================================
SqlSessionFactoryBean 是对 SqlSessionFactory 初始化过程的封装,Spring 会?在适当的时候执行这个初始化过程,得到最终的 SqlSessionFactory 对象。
SqlSessionFactoryBean 的创建过程如下(注意方法签名在前面的基础上有变动):
@Bean
public SqlSessionFactoryBean sqlSessionFactory(
DataSource dataSource,
ResourcePatternResolver resolver
) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(resolver.getResources("classpath*:mappers/*.xml"));
return bean;
}
其中:
第一个参数 dataSource 就是前面生成的数据源对象;
第二个参数 resolver 是 Spring 自动提供的,用于搜索指定路径下的所有 xml 文件。本文不会包含 xml 文件,所以这个配置是无效的,这行可以不写,不过写了也不影响程序运行。
[](
)3. MapperScannerConfigurer 初始化
====================
===============================================================================
MapperScannerConfigurer 的职责是在指定路径下搜索所有的 Mapper 接口类(参考它的?postProcessBeanDefinitionRegistry()?方法),并通过 MapperFactoryBean 将其注册到 MapperRegistry 中。
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setBasePackage("com.hyd.mybatis3test");
return configurer;
}
[](
)4. 验证初始化过程成功
=================================================================================
为了验证上面的初始化过程完成了,我们在?com.hyd.mybatis3test?包下面创建一个 Mapper 类:
@Mapper
public interface SampleMapper {
@Update("create table if not exists user(id int)")
void createUserTable();
}
以及一个 Service 类:
@Service
public static class SampleService {
@Autowired
private SampleMapper sampleMapper;
@PostConstruct
public void init() {
sampleMapper.createUserTable();
}
}
然后别忘了在 SpringMyBatisApplication 顶上添加一个?@ComponentScan(“com.hyd.mybatis3test”)?注解,否则 Spring 会找不到 SampleService。
运行 SpringMyBatisApplication.main() 方法,我们就能在输出中找到这样的内容:
...
SampleMapper.createUserTable - ==> Preparing: create table if not exists user(id int)
SampleMapper.createUserTable - ==> Parameters:
SampleMapper.createUserTable - <== Updates: 0
...
评论