日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:113日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久成人福利| 国产精品极品国产中出| 亚洲精品福利电影| 亚洲美女久久精品| 日韩一区二区在线免费| 秋霞影视一区二区三区| 亚洲高清毛片| 99香蕉国产精品偷在线观看| 国产精品社区| 日本va欧美va瓶| 国产亚洲欧美日韩在线观看一区二区| 国产欧美自拍一区| 里番精品3d一二三区| 国产精品久久乐| 欧美黄页在线免费观看| 国产一区二区三区四区五区| 手机在线电影一区| 久久在线免费| 亚洲精品123区| 日韩中文字幕麻豆| 欧美综合精品| 日韩综合在线| 欧美日韩激情在线一区二区三区| 麻豆精品91| 国产精品永久| 成人久久一区| 亚洲日产av中文字幕| 卡一卡二国产精品| 中文字幕人成乱码在线观看| 欧美69视频| 日本久久一区| sm久久捆绑调教精品一区| 伊人久久婷婷| 国产欧美日韩一区二区三区在线| 91偷拍一区二区三区精品| 99视频在线精品国自产拍免费观看| 日本中文字幕一区二区视频| 四虎8848精品成人免费网站 | 亚洲a成人v| 国产精品一区二区精品| 日韩精品一区二区三区免费观影| 亚洲一区二区av| 久久国内精品视频| 久久婷婷久久| 日韩成人午夜精品| 亚洲精品.com| 日韩av网站在线观看| 国产亚洲一区二区手机在线观看 | 蜜桃视频在线网站| 亚洲精品在线a| 精品视频一区二区三区四区五区| 欧美不卡高清| 国产精品亚洲人成在99www| 欧美色图一区| 国产欧美自拍一区| 香蕉成人久久| 欧美xxxx中国| 日韩精品久久久久久| 精品捆绑调教一区二区三区| 日本一区二区三区中文字幕| 日韩大片在线播放| 日本不卡的三区四区五区| 日韩免费看片| 欧美日韩亚洲国产精品| 婷婷综合社区| 欧美国产免费| 石原莉奈一区二区三区在线观看| 中文字幕人成乱码在线观看| 日韩精品免费观看视频| 极品裸体白嫩激情啪啪国产精品| 国产精品第一| 日韩一区二区三免费高清在线观看 | 国产精品第一| 亚洲主播在线| 日韩理论片av| 国产精品极品在线观看| 日韩精品一级二级| 日韩国产一区| 国产伦精品一区二区三区在线播放| 99国产精品| 日韩久久精品| 九九久久国产| 国产日韩一区| 日韩1区2区3区| 久久av在线| 激情91久久| 久久国产日本精品| 日韩av有码| 久久精品国产免费| 欧美影院视频| 视频一区日韩精品| 亚洲一区网站| 91成人网在线观看| 91偷拍一区二区三区精品| 国产精品毛片aⅴ一区二区三区| 亚洲欧洲美洲国产香蕉| 亚洲一区二区三区高清不卡| 99成人在线视频| 91欧美在线| 成人在线超碰| 久久99免费视频| 国产精品中文| 国产丝袜一区| 国产欧美一区| 欧美日韩网址| 日韩av电影一区| 日韩激情av在线| 日韩国产欧美在线视频| 蜜臀av亚洲一区中文字幕| 伊人成人在线视频| 99riav国产精品| 亚洲免费一区二区| 亚洲一区二区三区高清不卡| 午夜视频精品| 9色精品在线| 亚洲欧美日韩视频二区| 性色一区二区| 中文字幕亚洲精品乱码| 日本亚洲不卡| 日韩国产在线观看一区| 日韩高清一区| 国产日韩亚洲欧美精品| 国产精品久久乐| 国产欧美日韩在线一区二区| 国产精品久久国产愉拍| 麻豆视频一区二区| 精品久久在线| 亚洲h色精品| 亚洲一区二区三区四区五区午夜| 久久成人一区| 日韩国产欧美三级| 久久99偷拍| 天堂中文在线播放| 国产综合欧美| 一区二区三区四区日韩| 亚州国产精品| 国产精品亚洲欧美| www在线观看黄色| 日韩中文在线电影| 99视频精品| 日韩福利视频网| 久久久免费人体| 欧美天堂视频| 激情丁香综合| 三级欧美在线一区| 欧美久久一区二区三区| 久久成人福利| 91精品蜜臀一区二区三区在线| 夜夜精品视频| 青青草国产成人99久久| 精品一区二区三区的国产在线观看 | 国产精品18| 国产精品成人a在线观看| 日韩在线观看不卡| 夜夜精品视频| 国产精品亚洲四区在线观看| 天堂av在线| 男人操女人的视频在线观看欧美| 奇米色欧美一区二区三区| 精品国产亚洲日本| 91精品一区国产高清在线gif| 视频一区二区国产| 国产精品v日韩精品v欧美精品网站| 国产一区二区三区四区五区| 久久精品国产大片免费观看| 日韩精品一级二级| 久久影院资源站| 在线综合亚洲| 国产精品日韩精品在线播放| 欧洲精品一区二区三区| 激情91久久| 国产毛片精品| 一区二区三区四区在线看| 中文字幕av一区二区三区人| 麻豆国产精品视频| 中文日韩欧美| 欧美精品成人| 黄色av一区| 国产精品日韩精品在线播放 | 国产精品日韩久久久| 久久中文在线| 亚洲一区二区三区免费在线观看| 国产精品美女午夜爽爽| 国产91一区| 久久狠狠久久| 亚洲激情社区| 国产一区一一区高清不卡| 中文日韩欧美| 国产精选在线| 欧美日韩伊人| 亚洲深夜影院| 精品亚洲精品| 中文字幕日本一区| 亚洲福利免费| 麻豆国产91在线播放| 亚洲无线观看| 欧美.日韩.国产.一区.二区 | 群体交乱之放荡娇妻一区二区| 97久久精品| 国产视频一区在线观看一区免费|