最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis源碼解析——獲取SqlSessionFactory方式

 更新時間:2021年12月16日 10:31:38   作者:rz_0212  
這篇文章主要介紹了MyBatis源碼解析——獲取SqlSessionFactory方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

MyBatis源碼解析_獲取SqlSessionFactory

我們都知道,在Mybatis中,對數(shù)據(jù)庫的增刪改查,實際上是由SqlSession來操作的,而SqlSession又是從SqlSessionFactory中得到的,那么問題來了,SqlSessonFactory是如何獲得的呢?我們一起來解讀一下Mybatis是如何加載配置文件,從而獲取SqlSessionFactory的。

首先從Resources.getResourceAsReader(path)

傳入我們mybatis全局配置文件得到一個輸入流InputStream,這里用Reader來接收。然后new一個SqlSessionFactoryBuilder對象,這是干嘛呢,這個對象里有一個build(Reader)方法,可以將我們傳入的Reader,經(jīng)過一系列的解析過程,返回給我們一個SqlSessionFactory實例,這樣我們就得到了想要的SqlSessionFactory了,估計要是這么就結(jié)束了,讀者會不會打死我呀(哈哈)。

所以我們就詳細說一下中間的解析過程。

進入到SqlSessionFactoryBuilder.build(Reader)方法中

它會再次調(diào)用build(Reader,environment(默認是null),Properties(默認是null))方法,在這里,根據(jù)我們傳入的參數(shù)先new出一個XMLConfigBuilder對象,稱為parser(就是個解析器),然后parser調(diào)用它的parse()方法,parse()方法中有一個parseConfiguration(parser.evalNode("/configuration"))方法,我們知道m(xù)ybatis的全局配置文件是以configuration作為根節(jié)點的,而且各個子節(jié)點是有嚴格順序的,這里就是找到configuration根節(jié)點,來分別解析根節(jié)點下的每個子節(jié)點,然后將解析結(jié)果放在一個Configuration中。

解析節(jié)點是調(diào)用XpathParser.evalNode(root , expression),返回一個XNode,當(dāng)作參數(shù),放在一個**Element(XNode)方法中去處理節(jié)點里每一個信息。這里我們選一個mapperElement(root.evalNode("mappers"))來看看,它是如何解析mappers這個子節(jié)點的。

進入到mapperElement(XNode)方法后

先去判斷傳入的節(jié)點是否為null,不為null則解析XNode下的每一個孩子節(jié)點,(在mappers標(biāo)簽下,可以插入兩種子節(jié)點,一種是package,這種做法,要求接口和xml文檔在同一個包下,另一種是mapper,mapper節(jié)點里有三種屬性,分別是resource,url,class,至多只能選一種)。

這里我我們來判斷子節(jié)點名字是否為"package",如果是,將package節(jié)點中的name取出,調(diào)用Configuration.addMappers(mapperPackage)方法,實際上調(diào)用MapperRegistry.addMappers(packeagename)方法,在這里,又new出了一個ResolverUtil<Class<?>>對象resolverUtil,它可以通過find()方法,找到該包下所有的所有的class或是別的文件,然后篩選出所有.class文件(不是class文件不要),如果是接口的話(不是接口不管),new出一個MapperAnnotationBuilder對象parser(實際上也是個解析器),調(diào)用parser.parse()方法,加載與接口名相同的XML文件,保存在configuration中。

如果子節(jié)點名字不是package

則取出"resource"、"url"、"class"等屬性,分別進行判空,如果屬性resource中有值,先將resource所對應(yīng)的xml文件給轉(zhuǎn)成一個InputStream,再new出一個XMLMapperBuilder(inputStream,configuration,resource)對象mapperParser(這里也是個解析器),調(diào)用parse()方法,對接口里所對應(yīng)的XML文件去解析,具體解析過程和解析mybatis全局配置文件比較類似。

在解析每一個增刪改查標(biāo)簽,都會new一個mappedStatement對象statement(這里是通過它的靜態(tài)內(nèi)部類Builder來new的),相當(dāng)于一個MappedStatemet就代表了一個增刪改查的詳細信息 ,同樣MappedStatement也保存在Configuration中。

對于url中有值,過程和resource那個一樣,這里不作講述。對于mapperClass中有值,通過全類名反射,拿到對應(yīng)的接口,調(diào)用configuration.addMapper(mapperInterface)方法,具體過程和package那個一樣,也不再講述。

經(jīng)過一系列的解析,終于完成了

mappers節(jié)點的所有信息也都保存在Configuration中。這個時候回到SqlSessionFactoryBuilder中,將返回的Configuration對象作為參數(shù),調(diào)用它的build(configuration)方法,這里是關(guān)鍵的一步,此時根據(jù)configuration,new出了一個DefaultSqlSessionFactory對象返回給我們。

我們來看一下DefaultSqlSessionFactory這個類有啥特別的呢,它實現(xiàn)了SqlSessionFactory接口,這個接口里有很多openSession()的重載方法,原來如此,這里我們終于得到了SqlSessionFactory,也就是一個DefaultSqlSessionFactory對象,這個對象里保存著我們的Configuration,而Configuration里又保存著我們?nèi)峙渲梦募锏乃行畔?,以?*mapper.xml文件里所有信息。

如圖所示。

好啦,SqlSessionFactory獲取過程就講到這里啦,想要了解更多細節(jié)的童鞋,也可以自己去一步步debug,跟蹤源碼,了解整個過程

用MyBatis的配置文件獲取SqlSessionFactory

import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class GetSqlSessionFactory {
    private static SqlSessionFactory sqlSessionFactory;    
    static{
        String rs="mybatis-config.xml";
        try {
            Reader reader=Resources.getResourceAsReader(rs);
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            sqlSessionFactory=builder.build(reader);
            //sqlSessionFactory.getConfiguration().addMappers("com.hengtian.mapper");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }    
    public  static SqlSessionFactory getInstance(){
        return sqlSessionFactory;
    }    
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳談Lock與synchronized 的區(qū)別

    詳談Lock與synchronized 的區(qū)別

    下面小編就為大家?guī)硪黄斦凩ock與synchronized 的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Spring中ApplicationEventPublisher發(fā)布訂閱模式的實現(xiàn)

    Spring中ApplicationEventPublisher發(fā)布訂閱模式的實現(xiàn)

    本文主要介紹了Spring中ApplicationEventPublisher發(fā)布訂閱模式的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • mybatis高級映射一對多查詢實現(xiàn)代碼

    mybatis高級映射一對多查詢實現(xiàn)代碼

    本篇文章主要介紹了mybatis高級映射一對多查詢實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • SpringCloudAlibaba微服務(wù)調(diào)用組件OpenFeign的方法

    SpringCloudAlibaba微服務(wù)調(diào)用組件OpenFeign的方法

    Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端,其靈感來自Retrofit、JAXRS-2.0以及WebSocket,Feign可幫助我們更加便捷、優(yōu)雅地調(diào)用HTTP API,這篇文章主要介紹了SpringCloudAlibaba微服務(wù)調(diào)用組件OpenFeign,需要的朋友可以參考下
    2024-07-07
  • Spring 整合 MyBatis的實現(xiàn)步驟

    Spring 整合 MyBatis的實現(xiàn)步驟

    SpringMVC 本來就是 Spring 框架的一部分,這兩者無須再做整合,所以 SSM 整合的關(guān)鍵就是Spring對MyBatis的整合,三大框架整合完成后,將以 Spring 為核心,調(diào)用有關(guān)資源,高效運作,這篇文章主要介紹了 Spring 整合 MyBatis的實現(xiàn)步驟,需要的朋友可以參考下
    2023-02-02
  • JDK?version和class?file?version(Class編譯版本號)對應(yīng)關(guān)系解讀

    JDK?version和class?file?version(Class編譯版本號)對應(yīng)關(guān)系解讀

    這篇文章主要介紹了JDK?version和class?file?version(Class編譯版本號)對應(yīng)關(guān)系,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java注解Annotation與自定義注解詳解

    Java注解Annotation與自定義注解詳解

    本文全面講述了Java注解Annotation與Java自定義注解及相關(guān)內(nèi)容,大家可以認真看看
    2018-03-03
  • java?System類和Arrays類詳解

    java?System類和Arrays類詳解

    這篇文章主要介紹了java?System類和Arrays類詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Java 通過API操作GraphQL

    Java 通過API操作GraphQL

    這篇文章主要介紹了Java 通過API操作GraphQL的方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-05-05
  • SpringBoot關(guān)于List集合的校驗方式

    SpringBoot關(guān)于List集合的校驗方式

    這篇文章主要介紹了SpringBoot關(guān)于List集合的校驗方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論

普兰县| 逊克县| 新昌县| 公安县| 肃宁县| 确山县| 荆门市| 汉阴县| 永和县| 吉林省| 鹤峰县| 鲜城| 且末县| 会理县| 会宁县| 大新县| 班玛县| 洛隆县| 南丰县| 咸丰县| 广昌县| 织金县| 禄劝| 泌阳县| 山丹县| 赤峰市| 桂林市| 临清市| 阿拉善盟| 遂昌县| 盐城市| 荥阳市| 云林县| 南丰县| 陕西省| 霍城县| 元朗区| 云林县| 兴文县| 泗洪县| 宣化县|