成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

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

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

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

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

一、Mybatis 三件套

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

DataSource:它是訪問數據庫所必須的數據源對象,這個初始化失敗就無法直接訪問數據庫。 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 ...; }}

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

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

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

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

對應的 DataSource 初始化實現如下:

@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 會在適當的時候執行這個初始化過程,得到最終的 SqlSessionFactory 對象。

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

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

其中:

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

3. MapperScannerConfigurer 初始化

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

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

4. 驗證初始化過程成功

為了驗證上面的初始化過程完成了,我們在 com.hyd.mybatis3test 包下面創建一個 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。

運行 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 對象。

到此這篇關于理解 MyBatis 是如何在 Spring 容器中初始化的的文章就介紹到這了,更多相關mybatis在spring中的初始化內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲精品国产第一综合99久久| 亚洲成人免费视频| 伊人婷婷欧美激情| 99热在这里有精品免费| 精品欧美乱码久久久久久1区2区| 日韩成人一级大片| 亚洲欧美激情诱惑| 亚洲线精品一区二区三区八戒| 亚洲经典一区| 亚洲人成精品久久久久| 欧美精品18| 亚洲国产精品成人综合| av一本久道久久综合久久鬼色| 欧美精品日韩一本| 国产综合色视频| 欧美日韩一级视频| 玖玖九九国产精品| 久久一区中文字幕| 亚洲成a人片在线不卡一二三区 | 日韩午夜中文字幕| 国产超碰在线一区| 欧美xxxxxxxx| 91麻豆精品一区二区三区| 精品国产露脸精彩对白| 成人毛片老司机大片| 欧美xxxxx裸体时装秀| 成人污污视频在线观看| 日韩欧美成人一区| 国产精品一线二线三线| 在线观看一区二区视频| 亚洲成人你懂的| 在线亚洲免费视频| 国产在线不卡一卡二卡三卡四卡| 欧美日韩一区不卡| 国产福利电影一区二区三区| 精品国产乱子伦一区| 国产一区二区福利| 欧美日韩成人激情| av电影一区二区| 精品国产一区二区在线观看| 牛夜精品久久久久久久99黑人| 精品国产一区二区三区忘忧草 | gogo大胆日本视频一区| 精品国产免费一区二区三区四区 | 亚洲一区在线视频| 91国模大尺度私拍在线视频| 亚洲v中文字幕| 香蕉久久夜色精品国产| 日本麻豆一区二区三区视频| 欧美视频一区二区三区四区 | 欧美日韩国产免费观看| 久久激情中文| 另类欧美日韩国产在线| 91麻豆精品久久久久蜜臀| 91在线一区二区| 亚洲人成伊人成综合网小说| 色先锋久久av资源部| 男女激情视频一区| 欧美一区二区三区色| 99精品视频在线观看| 一色桃子久久精品亚洲| 久久国产精品一区二区三区| 久久疯狂做爰流白浆xx| 精品福利av导航| 日韩网站在线| 美女视频一区二区| 精品国产91乱码一区二区三区| 在线不卡亚洲| 免费在线观看一区二区三区| 日韩欧美中文字幕精品| 欧美视频亚洲视频| 亚洲va韩国va欧美va| 欧美二区三区91| 99v久久综合狠狠综合久久| 一区视频在线播放| 日本精品一级二级| 99久久精品费精品国产一区二区| 亚洲欧美aⅴ...| 欧美精品在线视频| 狠狠色综合色区| 日本欧美一区二区在线观看| 日韩欧美国产电影| 国产日韩一区欧美| 成人综合婷婷国产精品久久蜜臀 | 国产精品久久久久桃色tv| 日本丶国产丶欧美色综合| 99久久99久久精品免费看蜜桃 | 欧美成人dvd在线视频| 午夜私人影院久久久久| 91精品国产综合久久国产大片| 国产精品初高中精品久久| 日韩精品亚洲专区| 久久久欧美精品sm网站| 免费日韩精品中文字幕视频在线| 成人听书哪个软件好| 夜夜操天天操亚洲| 91精品国产高清一区二区三区| 精品不卡一区二区三区| 激情综合色丁香一区二区| 国产精品美女一区二区| 色综合久久久久久久久| 91啪亚洲精品| 视频一区欧美日韩| 久久精品一区二区三区不卡| 色偷偷88欧美精品久久久| 欧美高清日韩| 精油按摩中文字幕久久| 中文字幕一区二区三区不卡在线| 91精品国产综合久久婷婷香蕉| 国产精品毛片va一区二区三区| 成人免费视频一区| 亚洲h在线观看| 国产无人区一区二区三区| 欧美在线综合视频| 在线观看一区视频| 成人黄色电影在线 | 亚洲精品欧美精品| 成人黄色av网站在线| 久久精品国产一区二区| 亚洲久草在线视频| 久久精品视频在线免费观看| 欧美久久久影院| 亚洲一区二三| 欧美日韩岛国| 成人三级伦理片| 激情另类小说区图片区视频区| 亚洲精品福利视频网站| 国产亚洲1区2区3区| 在线播放亚洲一区| 久久网站免费| 亚洲精品一区二区三区av| 暴力调教一区二区三区| 久久精品国产亚洲5555| 一区二区三区日本| 国产区在线观看成人精品| 欧美精品黑人性xxxx| 色婷婷综合视频在线观看| 狠狠综合久久av一区二区老牛| av在线不卡电影| 国产精品夜夜嗨| 免费看日韩精品| 亚洲午夜在线视频| 国产精品国产三级国产| 久久蜜臀精品av| 欧美久久久一区| 日本福利一区二区| 亚洲综合99| 亚洲精品国产精品国自产观看| 欧美69视频| www.欧美.com| 成人免费毛片app| 国产大陆a不卡| 精品综合免费视频观看| 日本va欧美va欧美va精品| 亚洲成a人片综合在线| 亚洲精品国产精华液| 国产精品不卡在线| 国产日产欧美一区二区三区| 欧美成人video| 欧美一区二区三区婷婷月色| 在线视频你懂得一区| 免费看黄裸体一级大秀欧美| 国产精品毛片| 亚洲欧美日韩在线观看a三区| 国产欧美大片| 国内精品嫩模av私拍在线观看| 91原创在线视频| 国产一区二区免费视频| 日韩成人伦理电影在线观看| 午夜久久久久久久久久一区二区| 亚洲人成在线观看一区二区| 最新高清无码专区| 欧美—级在线免费片| 国产拍揄自揄精品视频麻豆| 久久久国产精品麻豆| 精品1区2区在线观看| 精品国产乱码久久久久久老虎 | 欧美视频在线不卡| 日本在线不卡视频一二三区| 91成人在线精品| 欧美日韩一区二区三区视频 | 国产经典欧美精品| 一本色道久久加勒比精品| 国产精品久久久久久久久免费丝袜 | 91精品国产乱| 丝袜亚洲另类欧美综合| 久久精品国产第一区二区三区最新章节| 中文字幕一区二区三中文字幕| 欧美一区网站| 18欧美乱大交hd1984| 亚洲精品在线视频观看| 亚洲一区二区三区国产| 色婷婷综合久久久久中文一区二区| 午夜电影一区二区三区| 久久久久se| 狠狠色丁香久久婷婷综合_中| 欧美二区三区的天堂| 奇米影视一区二区三区| 久久久久国产精品人| 国产成a人无v码亚洲福利|