在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SqlSessionFactory創建過程

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

本篇文章我們首先解析 SqlSessionFactory 的創建過程。

1、實例代碼

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

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

第二步:根據輸入流構建 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、代碼剖析

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

①、獲取配置文件輸入流

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)

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

而 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 文件內容,也包括 xxxMapper.xml 文件內容。

圖片

⑤、build(configuration)

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

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

⑥、DefaultSqlSessionFactory(configuration)

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

3、總結

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    780

    瀏覽量

    44727
  • 代碼
    +關注

    關注

    30

    文章

    4882

    瀏覽量

    70061
  • factory
    +關注

    關注

    0

    文章

    4

    瀏覽量

    1937
  • mybatis
    +關注

    關注

    0

    文章

    63

    瀏覽量

    6848
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    labview怎么通過程序來創建波形圖表控件

    就是通過程序來實現控件的創建
    發表于 06-05 10:07

    MySql存儲過程創建以及Mybatis的調用遇到的問題概述

    MySql存儲過程創建以及Mybatis的調用
    發表于 07-04 11:06

    Linux內核創建新進程的過程分析

    PCB包含了一個進程的重要運行信息,所以我們將圍繞在創建一個新進程時,如何來建立一個新的PCB的這一個過程來進行分析,在Linux系統中,PCB主要是存儲在一個叫做task_struct這一個結構體中,創建新進程僅能通過
    發表于 08-08 08:42

    TCP服務器創建過程

    (UCOSIII版本)的基礎上進行修改,實現多客戶端連接的一個方法。1、TCP服務器創建過程建立一個TCP服務器需要經過創建連接conn=netconn_new(NETCONN_TCP);//
    發表于 08-24 08:03

    ESP32--FreeRTOS任務的創建與刪除過程是怎樣的?

    ESP32--FreeRTOS任務的創建與刪除過程是怎樣的?
    發表于 01-14 06:02

    FreeRTOS的任務創建過程

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

    淺談Keil-MDK創建及其編譯過程

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

    阿爾卡特軟交換產品VOIP數據創建過程

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

    altium-designer使用PCB向導來創建PCB詳細過程

    altium-designer使用PCB向導來創建PCB詳細過程,感興趣的可以看看。
    發表于 07-22 16:08 ?0次下載

    使用PCI Express模塊??創建Zynq UltraScale+的過程介紹

    本視頻介紹了使用處理子系統中的PCI Express模塊??創建Zynq UltraScale +解決方案的過程
    的頭像 發表于 11-28 06:35 ?3505次閱讀

    整理剖析,只為教你創建MySQL存儲過程

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

    易靈思JTAG寫入Flash工程的創建過程和燒寫操作

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

    如何創建 Docker 鏡像的能力

    本文將帶大家繼續深入了解 Dockerfile 鏡像創建過程中最重要的配置文件內容,更加透徹地了解整個容器鏡像的創建過程
    的頭像 發表于 09-16 09:39 ?1289次閱讀

    手寫一個MyBatis框架

    SqlSessionFactory 是獲取會話的工廠,每次使用MyBatis 操作數據庫時, 都會開啟一個新的會話。在會話工廠的實現中,SqlSessionFactory 負責獲取數據源環境配置信息、構建事務工廠和創建操作SQL
    的頭像 發表于 04-20 11:29 ?704次閱讀

    創建jar文件的過程

    在這篇文章中,我們將介紹一下以編程方式創建jar文件的過程。在編寫軟件時,最終我們需要將其部署到生產狀態。在某些情況下,使用帶有獨立文件的classpath是可以的。通常情況下,處理一個文件會更方便
    的頭像 發表于 10-08 15:36 ?1042次閱讀
    主站蜘蛛池模板: 天天插天天透 | 日本全黄视频 | 动漫精品成人免费网站 | 制服丝袜国产精品 | 濑亚美莉iptd619在线观看 | 黄色毛片基地 | 亚色成人 | 在线观看视频在线观看 | 黄 色 片 在 线 看 | 人人人干 | 免费大片黄在线观看 | 天堂网www最新版在线资源 | 在线天堂中文新版www | 久久久久久久国产精品电影 | 1717国产精品久久 | 亚洲成人观看 | 校园 春色 欧美 另类 小说 | 激情五月视频 | 亚在线 | 大量真实偷拍情侣视频野战 | 国内黄色录像 | 免费国产一区 | 午夜精品在线 | 91激情网 | 国产伦精品一区二区 | 女上男下边吃奶边做视频成都 | 天天狠狠操 | 麻豆三级在线播放 | 亚洲4区 | 色偷偷91综合久久噜噜 | 四虎网址在线观看 | 久久久午夜毛片免费 | 天天操天天爽天天射 | 午夜免费小视频 | 爽a中文字幕一区 | 日本一二区视频 | 人人澡人人人人夜夜爽 | 俄罗斯小屁孩cao大人免费 | 中文字幕亚洲区 | 四虎免费影院4hu永久免费 | 久久性久久性久久久爽 |