日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MyBatis运行原理(一)SqlSessionFactory对象创建过程分析

發布時間:2024/9/30 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyBatis运行原理(一)SqlSessionFactory对象创建过程分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、寫在前面

MyBatis基于接口形式的編程主要步驟:

1.創建SqlSessionFactory對象。

2.根據SqlSessionFactory對象獲取SqlSession對象。

3.為mapper 接口創建代理對象。

4.使用mapper 接口代理對象執行對應的增刪改查操作。

下面就通過分析源碼來探索在創建SqlSessionFactory對象的過程中都發生了什么。

二、SqlSessionFactory對象創建過程分析

入口程序:

private SqlSessionFactory getSqlSessionFactory() throws IOException {String resource = "mybatis-config.xml";InputStream is = Resources.getResourceAsStream(resource);// 將斷點打在下面的代碼前return new SqlSessionFactoryBuilder().build(is);}

1.首先會跳到SqlSessionFactoryBuilder類中的build(InputStream inputStream)方法。

// ======= SqlSessionFactoryBuilder 類中的方法 =======public SqlSessionFactory build(InputStream inputStream) {return build(inputStream, null, null);}

在該方法中調用了另一個build(InputStream inputStream, String environment, Properties properties)方法,定義了一個XMLConfigBuilder對象,通過這個對象調用自身的parse()方法對配置文件進行解析。

// ======= SqlSessionFactoryBuilder 類中的方法 =======public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {try {// 創建一個XMLConfigBuilder 解析器XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);// 調用parser 解析器中的parse()方法return build(parser.parse());} catch (Exception e) {throw ExceptionFactory.wrapException("Error building SqlSession.", e);} finally {ErrorContext.instance().reset();try {inputStream.close();} catch (IOException e) {}}}

2.下面來看看是如何進行文件解析的,跳到XMLConfigBuilder類中的parse()方法,在parse()方法中調用了parseConfiguration(XNode root)方法,這個方法用于解析配置文件。

// ======= XMLConfigBuilder類中的方法 =======public Configuration parse() {if (parsed) {throw new BuilderException("Each XMLConfigBuilder can only be used once.");}parsed = true;/** * parseConfiguration() 方法用于解析MyBatis 全局配置文件與SQL 映射文件中的相關配置* "/configuration" 就是對應全局配置文件中的<configuration> 標簽* parser 是XPathParser 類的實例,通過該對象解析XML 配置文件*/parseConfiguration(parser.evalNode("/configuration"));return configuration;}

下面是parseConfiguration(XNode root)中的具體源碼,在這個方法中會對MyBatis 全局配置文件中的信息與SQL 映射文件中的信息進行解析,并把對應的信息保存在Configuration對象中。建議具體了解一下其中的settingsElement(settings);方法與mapperElement(root.evalNode("mappers"));方法。

// ======= XMLConfigBuilder類中的方法 =======private void parseConfiguration(XNode root) {try {/** * settings、typeAliases、plugins 等用于對應MyBatis 全局配置文件中的標簽* 將MyBatis 全局配置文件的標簽信息保存在Configuration 對象中*/propertiesElement(root.evalNode("properties"));Properties settings = settingsAsProperties(root.evalNode("settings"));loadCustomVfs(settings);typeAliasesElement(root.evalNode("typeAliases"));pluginElement(root.evalNode("plugins"));objectFactoryElement(root.evalNode("objectFactory"));objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));reflectorFactoryElement(root.evalNode("reflectorFactory"));// 將<settings> 標簽中的設置也保存在Configuration 中settingsElement(settings);// 設置事務的相關配置與數據源environmentsElement(root.evalNode("environments"));databaseIdProviderElement(root.evalNode("databaseIdProvider"));typeHandlerElement(root.evalNode("typeHandlers"));/*** 接著開始解析<mappers>標簽中的信息* 在mapperElement() 方法中會對<mappers> 標簽下的子標簽<mapper> 進行解析,* 解析完<mapper> 標簽后,接著調用XMLMapperBuilder 中的方法對SQL 映射文件進行解析,* 并把相應的信息也保存在Configuration 對象中*/mapperElement(root.evalNode("mappers"));} catch (Exception e) {throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);}}

通過上面對parseConfiguration(XNode root)方法的分析,我們知道MyBatis 全局配置文件與SQL 映射文件中的信息都會保存在Configuration 對象中。這其中還涉及到了很多的方法,在這里就不一一講述了,大家可以自己進行查看。

3.將信息保存在Configuration對象中后通過XMLConfigBuilder類中的parse()方法返回,作為參數傳遞到SqlSessionFactory類中的build(Configuration config)方法。

最后接著返回一個DefaultSqlSessionFactory對象。到這里SqlSessionFactory對象就完成了創建的全部過程。

// ======= SqlSessionFactoryBuilder 類中的方法 =======public SqlSessionFactory build(Configuration config) {return new DefaultSqlSessionFactory(config);}

調用過程時序圖:

三、總結

在SqlSessionFactory對象創建的過程中,對MyBatis 全局配置文件與SQL 映射文件中的信息進行了解析與保存,為后續創建會話(SqlSession)提供了基礎。這篇博文只是把創建過程進行了分析,略過了其中的一些細節,如果大家感興趣可以自己參考源碼。

總結

以上是生活随笔為你收集整理的MyBatis运行原理(一)SqlSessionFactory对象创建过程分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。