0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SqlSessionFactory創(chuàng)建過程

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-09-25 14:55 ? 次閱讀

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

1、實例代碼

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

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

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

public void init() {
    //定義mybatis全局配置文件
    String resource = "mybatis-config.xml";
    //加載 mybatis 全局配置文件
    InputStream inputStream = null;
    try {
        inputStream = Resources.getResourceAsStream(resource);
    } catch (IOException e) {
        e.printStackTrace();
    }
    //構(gòu)建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);
  }

在進(jìn)入到 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 的幾種方式。

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

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

而 Mybatis 使用的是 DOM 形式,并結(jié)合 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 標(biāo)簽處開始解析。然后我們進(jìn)入到 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 配置文件里面的各個標(biāo)簽名嘛,是的,這就是解析該文件,然后全部放在 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、總結(jié)

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    750

    瀏覽量

    43900
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67767
  • factory
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    1874
  • mybatis
    +關(guān)注

    關(guān)注

    0

    文章

    58

    瀏覽量

    6691
收藏 人收藏

    評論

    相關(guān)推薦

    labview怎么通過程序來創(chuàng)建波形圖表控件

    就是通過程序來實現(xiàn)控件的創(chuàng)建
    發(fā)表于 06-05 10:07

    MySql存儲過程創(chuàng)建以及Mybatis的調(diào)用遇到的問題概述

    MySql存儲過程創(chuàng)建以及Mybatis的調(diào)用
    發(fā)表于 07-04 11:06

    Linux內(nèi)核創(chuàng)建新進(jìn)程的過程分析

    PCB包含了一個進(jìn)程的重要運(yùn)行信息,所以我們將圍繞在創(chuàng)建一個新進(jìn)程時,如何來建立一個新的PCB的這一個過程來進(jìn)行分析,在Linux系統(tǒng)中,PCB主要是存儲在一個叫做task_struct這一個結(jié)構(gòu)體中,創(chuàng)建新進(jìn)程僅能通過
    發(fā)表于 08-08 08:42

    TCP服務(wù)器創(chuàng)建過程

    (UCOSIII版本)的基礎(chǔ)上進(jìn)行修改,實現(xiàn)多客戶端連接的一個方法。1、TCP服務(wù)器創(chuàng)建過程建立一個TCP服務(wù)器需要經(jīng)過創(chuàng)建連接conn=netconn_new(NETCONN_TCP);//
    發(fā)表于 08-24 08:03

    ESP32--FreeRTOS任務(wù)的創(chuàng)建與刪除過程是怎樣的?

    ESP32--FreeRTOS任務(wù)的創(chuàng)建與刪除過程是怎樣的?
    發(fā)表于 01-14 06:02

    FreeRTOS的任務(wù)創(chuàng)建過程

    FreeRTOS筆記(四):任務(wù)創(chuàng)建/刪除,掛起/解掛詳解在第二篇筆記中介紹了任務(wù)創(chuàng)建的API,并且簡單使用了相關(guān)API,本文將詳細(xì)介紹任務(wù)創(chuàng)建過程。一、任務(wù)
    發(fā)表于 02-08 06:10

    淺談Keil-MDK創(chuàng)建及其編譯過程

    淺談Keil-MDK創(chuàng)建項目&編譯過程---Code-data,RO-data,RW-data,ZI-data一、編譯過程二、MDK 編譯工具(1)創(chuàng)建一個新的工程(2)添加 star
    發(fā)表于 02-24 06:03

    阿爾卡特軟交換產(chǎn)品VOIP數(shù)據(jù)創(chuàng)建過程

    阿爾卡特軟交換產(chǎn)品VOIP數(shù)據(jù)創(chuàng)建過程成都通信建設(shè)工程局 王璽 薛恒飛  郵政編碼 611130[摘要] 本文通過對阿爾卡特移動軟交換設(shè)備在VOIP數(shù)據(jù)如何創(chuàng)建過程的介紹,簡
    發(fā)表于 05-16 01:39 ?6次下載

    altium-designer使用PCB向?qū)?b class='flag-5'>創(chuàng)建PCB詳細(xì)過程

    altium-designer使用PCB向?qū)?b class='flag-5'>創(chuàng)建PCB詳細(xì)過程,感興趣的可以看看。
    發(fā)表于 07-22 16:08 ?0次下載

    使用PCI Express模塊??創(chuàng)建Zynq UltraScale+的過程介紹

    本視頻介紹了使用處理子系統(tǒng)中的PCI Express模塊??創(chuàng)建Zynq UltraScale +解決方案的過程。
    的頭像 發(fā)表于 11-28 06:35 ?3241次閱讀

    整理剖析,只為教你創(chuàng)建MySQL存儲過程

    簡單地說,存儲過程就是一條或者多條SQL語句的集合,可視為批文件,但是其作用不僅限于批處理。本篇主要介紹如何創(chuàng)建存儲過程和存儲函數(shù)以及變量的使用,如何調(diào)用、查看、修改、刪除存儲過程和存
    的頭像 發(fā)表于 07-02 17:11 ?2012次閱讀

    易靈思JTAG寫入Flash工程的創(chuàng)建過程和燒寫操作

    易靈思在通過JTAG寫入Flash時,需要手動創(chuàng)建一個打通JTAG到Flash的bridge,這里我們來介紹下工程創(chuàng)建過程和燒寫操作。
    的頭像 發(fā)表于 03-09 16:04 ?4951次閱讀
    易靈思JTAG寫入Flash工程的<b class='flag-5'>創(chuàng)建</b><b class='flag-5'>過程</b>和燒寫操作

    如何創(chuàng)建 Docker 鏡像的能力

    本文將帶大家繼續(xù)深入了解 Dockerfile 鏡像創(chuàng)建過程中最重要的配置文件內(nèi)容,更加透徹地了解整個容器鏡像的創(chuàng)建過程。
    的頭像 發(fā)表于 09-16 09:39 ?1028次閱讀

    手寫一個MyBatis框架

    SqlSessionFactory 是獲取會話的工廠,每次使用MyBatis 操作數(shù)據(jù)庫時, 都會開啟一個新的會話。在會話工廠的實現(xiàn)中,SqlSessionFactory 負(fù)責(zé)獲取數(shù)據(jù)源環(huán)境配置信息、構(gòu)建事務(wù)工廠和創(chuàng)建操作SQL
    的頭像 發(fā)表于 04-20 11:29 ?523次閱讀

    創(chuàng)建jar文件的過程

    在這篇文章中,我們將介紹一下以編程方式創(chuàng)建jar文件的過程。在編寫軟件時,最終我們需要將其部署到生產(chǎn)狀態(tài)。在某些情況下,使用帶有獨立文件的classpath是可以的。通常情況下,處理一個文件會更方便
    的頭像 發(fā)表于 10-08 15:36 ?721次閱讀