溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spring 容器中如何實現(xiàn)MyBatis初始化

發(fā)布時間:2020-11-10 14:56:22 來源:億速云 閱讀:235 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細講解有關(guān)Spring 容器中如何實現(xiàn)MyBatis初始化,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

MyBatis 初始化過程就是生成一些必須的對象放到 Spring 容器中。問題是這個過程到底生成了哪些對象?當(dāng)遇到 MyBatis 初始化失敗時,如何正確的找到分析問題的切入點?本文將針對這些問題進行介紹。

本文基于 MyBatis 3 和 Spring,假設(shè)讀者已經(jīng)知道如何使用 Maven 和 MyBatis,以及了解 Spring 的容器機制。

一、Mybatis 三件套

我們知道 MyBatis 的主要功能是由 SqlSessionFactory 和 Mapper 兩者提供的,初始化 MyBatis 就是初始化這兩類對象。除此之外 DataSource 作為數(shù)據(jù)庫訪問對象也是必不可少。因此首先我們應(yīng)該記住 MyBatis 初始化的核心三件套:

  • DataSource:它是訪問數(shù)據(jù)庫所必須的數(shù)據(jù)源對象,這個初始化失敗就無法直接訪問數(shù)據(jù)庫。
  • SqlSessionFactoryBean:這是在 Spring 容器中對 SqlSessionFactory 初始化過程的封裝。
  • MapperScannerConfigurer:這是在 Spring 容器中對 Mapper 初始化過程的封裝。

具體來說,一個簡單的初始化過程就是下面這樣:

@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 ...;
  }
}

接下來介紹三件套各自如何初始化,下面的內(nèi)容是可以實際操作的,不妨動手試試。

1. DataSource 初始化

首先我們創(chuàng)建一個空的 Maven 項目,在 pom.xml 中加入下面的依賴關(guān)系:

<!-- 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>

<!-- 數(shù)據(jù)庫 -->
<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 的初始化過程,所以沒有復(fù)雜的 SQL,數(shù)據(jù)庫用的是嵌入式數(shù)據(jù)庫 h3。

然后我們在 com.hyd.mybatis3test 包下面創(chuàng)建一個 SpringMyBatisApplication 類,代碼在前面給過了。

對應(yīng)的 DataSource 初始化實現(xiàn)如下:

@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 會在適當(dāng)?shù)臅r候執(zhí)行這個初始化過程,得到最終的 SqlSessionFactory 對象。

SqlSessionFactoryBean 的創(chuàng)建過程如下(注意方法簽名在前面的基礎(chǔ)上有變動):

@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;
}

其中:

  • 第一個參數(shù) dataSource 就是前面生成的數(shù)據(jù)源對象;
  • 第二個參數(shù) resolver 是 Spring 自動提供的,用于搜索指定路徑下的所有 xml 文件。本文不會包含 xml 文件,所以這個配置是無效的,這行可以不寫,不過寫了也不影響程序運行。

3. MapperScannerConfigurer 初始化

MapperScannerConfigurer 的職責(zé)是在指定路徑下搜索所有的 Mapper 接口類(參考它的 postProcessBeanDefinitionRegistry() 方法),并通過 MapperFactoryBean 將其注冊到 MapperRegistry 中。

@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
  MapperScannerConfigurer configurer = new MapperScannerConfigurer();
  configurer.setBasePackage("com.hyd.mybatis3test");
  return configurer;
}

4. 驗證初始化過程成功

為了驗證上面的初始化過程完成了,我們在 com.hyd.mybatis3test 包下面創(chuàng)建一個 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() 方法,我們就能在輸出中找到這樣的內(nèi)容:

...
SampleMapper.createUserTable - ==>  Preparing: create table if not exists user(id int)
SampleMapper.createUserTable - ==> Parameters:
SampleMapper.createUserTable - <==    Updates: 0
...

這說明這條創(chuàng)建表格的 SQL 語句成功執(zhí)行了。

在前面三件套的基礎(chǔ)上,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 類。

總結(jié)

總之,MyBatis 的初始化核心過程就是三件套的初始化。而在 Spring Boot 應(yīng)用中,結(jié)合自動初始化和 @MapperScan 注解,我們無需手工初始化上這三件套,就能直接從容器中得到 Mapper 對象。

關(guān)于Spring 容器中如何實現(xiàn)MyBatis初始化就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI