您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Spring 容器中如何實現MyBatis初始化,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
MyBatis 初始化過程就是生成一些必須的對象放到 Spring 容器中。問題是這個過程到底生成了哪些對象?當遇到 MyBatis 初始化失敗時,如何正確的找到分析問題的切入點?本文將針對這些問題進行介紹。
本文基于 MyBatis 3 和 Spring,假設讀者已經知道如何使用 Maven 和 MyBatis,以及了解 Spring 的容器機制。
一、Mybatis 三件套
我們知道 MyBatis 的主要功能是由 SqlSessionFactory 和 Mapper 兩者提供的,初始化 MyBatis 就是初始化這兩類對象。除此之外 DataSource 作為數據庫訪問對象也是必不可少。因此首先我們應該記住 MyBatis 初始化的核心三件套:
具體來說,一個簡單的初始化過程就是下面這樣:
@Configuration public class SpringMyBatisApplication { public static void main(String[] args) { new AnnotationConfigApplicationContext(SpringMyBatisApplication.class); } @Bean public DataSource dataSource() { return ...; } @Bean public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) { return ...; } @Bean public MapperScannerConfigurer mapperScannerConfigurer() { return ...; } }
接下來介紹三件套各自如何初始化,下面的內容是可以實際操作的,不妨動手試試。
1. DataSource 初始化
首先我們創建一個空的 Maven 項目,在 pom.xml 中加入下面的依賴關系:
<!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <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.h3database</groupId> <artifactId>h3</artifactId> <version>1.4.199</version> </dependency>
本文重在演示 MyBatis 的初始化過程,所以沒有復雜的 SQL,數據庫用的是嵌入式數據庫 h3。
然后我們在 com.hyd.mybatis3test 包下面創建一個 SpringMyBatisApplication 類,代碼在前面給過了。
對應的 DataSource 初始化實現如下:
@Bean public DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName("org.h3.Driver"); dataSource.setUrl("jdbc:h3: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; }
其中:
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
...
這說明這條創建表格的 SQL 語句成功執行了。
在前面三件套的基礎上,MyBatis 也提供了更多的封裝。有了本文上面的鋪墊,相信讀者對這些封裝方式理解起來也會輕松很多。
二、@MapperScan 注解
@MapperScan 注解只不過是 MapperScannerConfigurer 的啟動器而已,使用這個注解,可以代替前面的 MapperScannerConfigurer 初始化。
三、SpringBoot 自動初始化
MyBatis 提供 mybatis-spring-boot-starter 庫用于在 Spring Boot 項目中自動初始化:
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency>
這個所謂的自動初始化實際上就是初始化 SqlSessionFactory 對象。初始化的過程由 org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration 完成,所需的配置都從 "mybatis-" 前綴的配置屬性中獲取,具體可以參考 org.mybatis.spring.boot.autoconfigure.MybatisProperties 類。
總結
總之,MyBatis 的初始化核心過程就是三件套的初始化。而在 Spring Boot 應用中,結合自動初始化和 @MapperScan 注解,我們無需手工初始化上這三件套,就能直接從容器中得到 Mapper 對象。
關于Spring 容器中如何實現MyBatis初始化就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。