成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Mybatis核心類SqlSessionFactory,看完我悟了

開發(fā) 前端
SqlSessionFactory 的創(chuàng)建過程就講完了,總的來說就是一個封裝了配置文件的工廠類。那么得到了 SqlSessionFactory 這個工廠對象,接下來干嘛?生產(chǎn) SqlSession,然后通過 SqlSession 進行數(shù)據(jù)庫的增刪改查操作。

哈嘍,大家好,我是指北君。

請大家搬好小板凳,指北君將會用最通俗易懂,圖文并茂的方式,給大家深入剖析 Mybatis 的實現(xiàn)原理。

本篇文章我們首先解析 SqlSessionFactory 的創(chuàng)建過程。

1、實例代碼

在實例代碼中,我們在測試類中寫了一個 init() 方法,里面包括了 SqlSessionFactory 的構建,分為兩步。

第一步:讀取配置文件 mybatis-config.xml 輸入流

第二步:根據(jù)輸入流構建 SqlSessionFactory;

public void init(){
//定義mybatis全局配置文件
String resource = "mybatis-config.xml";
//加載 mybatis 全局配置文件
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
//構建sqlSession的工廠
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

}

沒什么難的,去掉 try-catch,也就兩行代碼。

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

是的,那只是你以為的兩行代碼,其實......

話不多說,指北君就來給大家揭秘這冰山下面的東西。

2、代碼剖析

根據(jù)上面的時序圖,我們分析根據(jù)源碼分析每個步驟。

①、獲取配置文件輸入流

InputStream inputStream = Resources.getResourceAsStream("mybatis.config.xml");

這里沒什么好說的,就是獲取配置文件的輸入流。

②、build(in)

這里的 in 就是上一步獲取的輸入流 inputStream。

public SqlSessionFactory build(InputStream inputStream){
return build(inputStream, null, null);
}

在進入到 build 方法:

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties){
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}

③、XMLConfigBuilder(in)

這一段代碼是為了解析我們的配置文件,配置文件是 XML形式 ,我在之前的博客介紹過解析 XML 的幾種方式。

一種是基于樹的結構來解析的稱為DOM;另一種是基于事件流的形式稱為SAX和(StAX)

兩者各有優(yōu)缺點,我這里不做詳細說明,想了解的可以看我之前的文章。

而 Mybatis 使用的是 DOM 形式,并結合 XPath 來解析配置文件。

④、parse()

public Configuration parse(){
if (this.parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
} else {
this.parsed = true;
this.parseConfiguration(this.parser.evalNode("/configuration"));
return this.configuration;
}
}

從 /configuration 標簽處開始解析。然后我們進入到 this.parseConfiguration() 方法中:

private void parseConfiguration(XNode root){
try {
this.propertiesElement(root.evalNode("properties"));
Properties settings = this.settingsAsProperties(root.evalNode("settings"));
this.loadCustomVfs(settings);
this.loadCustomLogImpl(settings);
this.typeAliasesElement(root.evalNode("typeAliases"));
this.pluginElement(root.evalNode("plugins"));
this.objectFactoryElement(root.evalNode("objectFactory"));
this.objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
this.reflectorFactoryElement(root.evalNode("reflectorFactory"));
this.settingsElement(settings);
this.environmentsElement(root.evalNode("environments"));
this.databaseIdProviderElement(root.evalNode("databaseIdProvider"));
this.typeHandlerElement(root.evalNode("typeHandlers"));
this.mapperElement(root.evalNode("mappers"));
} catch (Exception var3) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + var3, var3);
}
}

看到這是不是很熟悉了,這不就是mybatis-config.xml 配置文件里面的各個標簽名嘛,是的,這就是解析該文件,然后全部放在 configuration 對象中。需要注意的是,這里的 configuration 對象不僅包括 mybatis-config.xml 文件內(nèi)容,也包括 xxxMapper.xml 文件內(nèi)容。

圖片

⑤、build(configuration)

public SqlSessionFactory build(Configuration config){
return new DefaultSqlSessionFactory(config);
}

就是去 new 了一個 DefaultSqlSessionFactory 對象,將 configuration 作為參數(shù)。

⑥、DefaultSqlSessionFactory(configuration)

public DefaultSqlSessionFactory(Configuration configuration){
this.configuration = configuration;
}

3、總結

自此,SqlSessionFactory 的創(chuàng)建過程就講完了,總的來說就是一個封裝了配置文件的工廠類。那么得到了 SqlSessionFactory 這個工廠對象,接下來干嘛?生產(chǎn) SqlSession,然后通過 SqlSession 進行數(shù)據(jù)庫的增刪改查操作。

沒錯,接下來,指北君將給大家介紹 SqlSession 的交互過程,這也是 Mybatis 里面最重要的一個對象。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2020-12-17 08:02:42

MyBatis插件框架

2021-08-18 10:30:10

GitHub程序員論文

2024-08-05 01:23:41

SQL語句MySQL

2020-12-15 08:03:57

Mybatis配置文件

2023-10-31 08:01:48

Mybatis參數(shù)jdbcurl?

2021-06-16 00:57:16

JVM加載機制

2023-03-09 13:39:14

數(shù)據(jù)比賽

2025-02-17 09:22:16

MySQLSQL語句

2021-02-06 09:07:58

字節(jié)跳動消息

2022-08-05 13:03:53

微軟Windows 11

2018-06-08 14:06:02

MVP架構Android

2023-07-29 22:02:06

MyBatis數(shù)據(jù)庫配置

2018-03-09 10:02:23

iPhone X下巴蘋果

2019-01-23 13:04:09

QLCNAND閃存

2020-03-03 20:04:30

SSD硬盤閃存

2013-06-20 11:11:00

程序員經(jīng)理

2021-11-05 11:10:13

MyBatisSQL查詢

2024-06-27 09:24:55

2021-03-09 08:00:13

設計秒殺TPS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美激情久久久久久 | 成人一区二区三区 | 亚洲福利网 | 高清国产一区二区 | 99re视频在线观看 | 精品香蕉一区二区三区 | 羞羞视频网 | 久久精点视频 | 婷婷桃色网 | 国产精品高 | 国产精品久久久久久久久久 | 亚洲网在线 | 久久成人午夜 | 久久精品国产免费高清 | 一级大片网站 | 欧美精品一区二区三区在线播放 | 综合久久久 | 免费国产一区 | 91视视频在线观看入口直接观看 | 黄色播放| 在线日韩中文字幕 | 国产在线中文字幕 | 欧美日韩三级 | 国产色在线 | 精品亚洲一区二区三区四区五区高 | 国产成人影院 | 亚洲网站在线播放 | 99视频免费看 | 日韩美女一区二区三区在线观看 | 国产精品视频网 | 国产精品色婷婷久久58 | 一区二区三区国产精品 | 一区二区三区国产视频 | 成人小视频在线观看 | 97caoporn国产免费人人 | av在线成人 | 亚洲一区二区在线 | 婷婷在线免费 | 精品亚洲一区二区三区 | 91激情视频 | 在线观看特色大片免费网站 |