国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

理解 MyBatis 是如何在 Spring 容器中初始化的

瀏覽:45日期:2023-08-03 11:35:34

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

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

一、Mybatis 三件套

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

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

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

@Configurationpublic 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.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.199</version></dependency>

本文重在演示 MyBatis 的初始化過程,所以沒有復(fù)雜的 SQL,數(shù)據(jù)庫用的是嵌入式數(shù)據(jù)庫 h2。

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

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

@Beanpublic DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName('org.h2.Driver'); dataSource.setUrl('jdbc:h2:mem:test'); return dataSource;}

2. SqlSessionFactoryBean 初始化

SqlSessionFactoryBean 是對 SqlSessionFactory 初始化過程的封裝,Spring 會在適當(dāng)?shù)臅r候執(zhí)行這個初始化過程,得到最終的 SqlSessionFactory 對象。

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

@Beanpublic 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 文件,所以這個配置是無效的,這行可以不寫,不過寫了也不影響程序運(yùn)行。

3. MapperScannerConfigurer 初始化

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

@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer configurer = new MapperScannerConfigurer(); configurer.setBasePackage('com.hyd.mybatis3test'); return configurer;}

4. 驗證初始化過程成功

為了驗證上面的初始化過程完成了,我們在 com.hyd.mybatis3test 包下面創(chuàng)建一個 Mapper 類:

@Mapperpublic interface SampleMapper { @Update('create table if not exists user(id int)') void createUserTable();}

以及一個 Service 類:

@Servicepublic static class SampleService { @Autowired private SampleMapper sampleMapper; @PostConstruct public void init() { sampleMapper.createUserTable(); }}

然后別忘了在 SpringMyBatisApplication 頂上添加一個 @ComponentScan('com.hyd.mybatis3test') 注解,否則 Spring 會找不到 SampleService。

運(yùn)行 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)于理解 MyBatis 是如何在 Spring 容器中初始化的的文章就介紹到這了,更多相關(guān)mybatis在spring中的初始化內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产在线精品香蕉综合网一区 | 久久成人网18网站 | 亚洲日产2021三区 | 中国一级毛片视频 | 久久亚洲精品视频 | 亚洲一区二区三区福利在线 | 手机看片1024欧美日韩你懂的 | 久久在线免费观看视频 | 久久精品成人欧美大片免费 | 欧美高清色视频在线播放 | 国产码一区二区三区 | 模特视频一二三区 | 日韩精品一区二区三区免费视频 | 欧美大尺度免费一级特黄 | 亚洲国产2017男人a天堂 | 男女一级爽爽快视频 | 日韩色道| 美女黄网站 | 久久精品中文字幕第一页 | 亚洲狠狠ady亚洲精品大秀 | 欧美亚洲综合网 | 国产婷婷一区二区三区 | 亚洲另类视频在线观看 | 一级做a爰片性色毛片中国 一级做a爰性色毛片 | 精品九九久久国内精品 | 日韩日b视频 | 中国黄色一级大片 | 成人18免费网站 | 国产欧美久久久另类精品 | 亚洲理论欧美理论在线观看 | 久久com| 美女张开腿给人网站 | 国内精品久久久久影院亚洲 | 亚洲免费区 | 国产一级在线现免费观看 | 成人老司机深夜福利久久 | 韩日一级视频 | 久久精品国产99久久香蕉 | 亚洲精品三级 | 日韩高清一级 | 久久久国产精品网站 |