亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

Mybatis源碼分析

lindroid / 865人閱讀

摘要:我認(rèn)為學(xué)習(xí)框架源碼分為兩步抓住主線,掌握框架的原理和流程理解了處理思路之后,再去理解面向?qū)ο笏枷牒驮O(shè)計(jì)模式的用法目前第一步尚有問(wèn)題,需要多走幾遍源碼,加深下理解,一起加油

這篇文章我們來(lái)深入閱讀下Mybatis的源碼,希望以后可以對(duì)底層框架不那么畏懼,學(xué)習(xí)框架設(shè)計(jì)中好的思想;
架構(gòu)原理 架構(gòu)圖

架構(gòu)流程圖

上面這兩幅圖來(lái)源于網(wǎng)絡(luò),不過(guò)畫(huà)的很好,基本說(shuō)明了Mybatis的架構(gòu)流程。

說(shuō)明:

Mybatis配置文件

SqlMapConfig.xml,此文件作為mybatis的全局配置文件,配置了mybatis的運(yùn)行環(huán)境等信息。

Mapper.xml,此文件作為mybatis的sql映射文件,文件中配置了操作數(shù)據(jù)庫(kù)的sql語(yǔ)句。此文件需要在 SqlMapConfig.xml中加載。

SqlSessionFactory

通過(guò)mybatis環(huán)境等配置信息構(gòu)造SqlSessionFactory,即會(huì)話工廠。

SqlSession

通過(guò)會(huì)話工廠創(chuàng)建sqlSession即會(huì)話,程序員通過(guò)sqlsession會(huì)話接口對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查操作。

Executor執(zhí)行器

mybatis底層自定義了Executor執(zhí)行器接口來(lái)具體操作數(shù)據(jù)庫(kù),Executor接口有兩個(gè)實(shí)現(xiàn),一個(gè)是基本執(zhí)行器(默認(rèn))、一個(gè)是緩存執(zhí)行器,sqlsession底層是通過(guò)executor接口操作數(shù)據(jù)庫(kù)的。

MappedStatement

它也是mybatis一個(gè)底層封裝對(duì)象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個(gè)selectinsertupdatedelete標(biāo)簽對(duì)應(yīng)一個(gè)Mapped Statement對(duì)象,selectinsertupdatedelete標(biāo)簽的id即是Mapped statement的id。

Mapped Statement對(duì)sql執(zhí)行輸入?yún)?shù)進(jìn)行定義,包括HashMap、基本類(lèi)型、pojo,Executor通過(guò)MappedStatement在執(zhí)行sql前將輸入的java對(duì)象映射至sql中,輸入?yún)?shù)映射就是jdbc編程中對(duì)preparedStatement設(shè)置參數(shù)。

Mapped Statement對(duì)sql執(zhí)行輸出結(jié)果進(jìn)行定義,包括HashMap、基本類(lèi)型、pojo,Executor通過(guò)MappedStatement在執(zhí)行sql后將輸出結(jié)果映射至java對(duì)象中,輸出結(jié)果映射過(guò)程相當(dāng)于jdbc編程中對(duì)結(jié)果的解析處理過(guò)程。

調(diào)用流程圖

Executor

MyBatis執(zhí)行器,是MyBatis 調(diào)度的核心,負(fù)責(zé)SQL語(yǔ)句的生成和查詢緩存的維護(hù)

StatementHandler

封裝了JDBC Statement操作,負(fù)責(zé)對(duì)JDBC statement 的操作,如設(shè)置參數(shù)、將Statement結(jié)果集轉(zhuǎn)換成List集合。

ParameterHandler

負(fù)責(zé)對(duì)用戶傳遞的參數(shù)轉(zhuǎn)換成JDBC Statement 所需要的參數(shù)

ResultSetHandler

負(fù)責(zé)將JDBC返回的ResultSet結(jié)果集對(duì)象轉(zhuǎn)換成List類(lèi)型的集合

TypeHandler

負(fù)責(zé)java數(shù)據(jù)類(lèi)型和jdbc數(shù)據(jù)類(lèi)型之間的映射和轉(zhuǎn)換

SqlSource

負(fù)責(zé)根據(jù)用戶傳遞的parameterObject,動(dòng)態(tài)地生成SQL語(yǔ)句,將信息封裝到BoundSql對(duì)象中,并返回BoundSql表示動(dòng)態(tài)生成的SQL語(yǔ)句以及相應(yīng)的參數(shù)信息

源碼解析 加載全局配置文件

找入口:SqlSessionFactoryBuilder#build方法

SqlSessionFactoryBuilder#build 構(gòu)建SqlSessionFactory
    XMLConfigBuilder#parse 全局配置文件解析,封裝成Configuration對(duì)象
        #parseConfiguration 從根路徑開(kāi)始解析,加載的信息設(shè)置到Configuration對(duì)象中
            #mapperElement 解析mapper映射文件
                XMLMapperBuilder#parse 具體解析mapper映射文件
                    SqlSessionFactoryBuilder#build:創(chuàng)建SqlSessionFactory接口的默認(rèn)實(shí)現(xiàn)類(lèi)

總結(jié)

1.SqlSessionFactoryBuilder創(chuàng)建SqlsessionFactory時(shí),需要傳入一個(gè)Configuration對(duì)象。 
2.XMLConfigBuilder對(duì)象會(huì)去實(shí)例化Configuration。 
3.XMLConfigBuilder對(duì)象會(huì)去初始化Configuration對(duì)象。 
    通過(guò)XPathParser去解析全局配置文件,形成Document對(duì)象 
    通過(guò)XPathParser去獲取指定節(jié)點(diǎn)的XNode對(duì)象。 
    解析Xnode對(duì)象的信息,然后封裝到Configuration對(duì)象中

相關(guān)類(lèi)和接口

|--SqlSessionFactoryBuilder 
|--XMLConfigBuilder 
|--XPathParser 
|--Configuration
加載映射配置文件

找入口:XMLConfigBuilder#mapperElement方法

XMLConfigBuilder#mapperElement:解析全局配置文件中的標(biāo)簽 
    |--XMLMapperBuilder#構(gòu)造方法:專(zhuān)門(mén)用來(lái)解析映射文件的 
        |--XPathParser#構(gòu)造方法: 
            |--XPathParser#createDocument():創(chuàng)建Mapper映射文件對(duì)應(yīng)的Document對(duì)象 
            |--MapperBuilderAssistant#構(gòu)造方法:用于構(gòu)建MappedStatement對(duì)象的 
        |--XMLMapperBuilder#parse(): 
            |--XMLMapperBuilder#configurationElement:專(zhuān)門(mén)用來(lái)解析mapper映射文件 
                |--XMLMapperBuilder#buildStatementFromContext:用來(lái)創(chuàng)建MappedStatement對(duì)象的 
                    |--XMLMapperBuilder#buildStatementFromContext 
                        |--XMLStatementBuilder#構(gòu)造方法:專(zhuān)門(mén)用來(lái)解析MappedStatement 
                        |--XMLStatementBuilder#parseStatementNode: 
                            |--MapperBuilderAssistant#addMappedStatement:創(chuàng)建 MappedStatement對(duì)象 
                                |--MappedStatement.Builder#構(gòu)造方法 
                                |--MappedStatement.Builder#build方法:創(chuàng)建MappedStatement對(duì)象,并存儲(chǔ) 到Configuration對(duì)象中

相關(guān)接口和類(lèi)

|--XMLConfigBuilder 
|--XMLMapperBuilder 
|--XPathParser 
|--MapperBuilderAssistant 
|--XMLStatementBuilder 
|--MappedStatement
SqlSource創(chuàng)建流程

找入口:XMLLanguageDriver#createSqlSource

XMLLanguageDriver#createSqlSource 創(chuàng)建SqlSource,解析SQL,封裝SQL語(yǔ)句(出參數(shù)綁定)和入?yún)⑿畔?
?    XMLScriptBuilder 構(gòu)造函數(shù):初始化動(dòng)態(tài)SQL中的節(jié)點(diǎn)處理器集合
?        XMLScriptBuilder#parseScriptNode 
?            #parseDynamicTags 解析selectinsert updatedelete標(biāo)簽中的SQL語(yǔ)句,最終將解析到的SqlNode封裝到MixedSqlNode中的List集合中
?            DynamicSqlSource 構(gòu)造方法:如果SQL中包含${}和動(dòng)態(tài)SQL語(yǔ)句,則將SqlNode封裝到DynamicSqlSource
?            RawSqlSource 構(gòu)造方法:如果SQL中包含#{},則將SqlNode封裝到RawSqlSource中,并指定parameterType
?                SqlSourceBuilder#parse
?                    ParameterMappingTokenHandler 構(gòu)造方法
?                        GenericTokenParser#構(gòu)造方法,指定待分析的openToken和closeToken并指定處理器
?                            GenericTokenParser#parse 解析#{}
?                                ParameterMappingTokenHandler#handleToken  處理token(#{}/${})
?                                    #buildParameterMapping 創(chuàng)建ParameterMapping對(duì)象
?                                StaticSqlSource 構(gòu)造方法,將解析之后的sql信息,封裝到StaticSqlSource 對(duì)象

相關(guān)類(lèi)和接口

|--XMLLanguageDriver 
|--XMLScriptBuilder 
|--SqlSource 
|--SqlSourceBuilder
創(chuàng)建Mapper代理對(duì)象

找入口:DefaultSqlSession#getMapper

|--DefaultSqlSession#getMapper:獲取Mapper代理對(duì)象 
?    |--Configuration#getMapper:獲取Mapper代理對(duì)象 
?        |--MapperRegistry#getMapper:通過(guò)代理對(duì)象工廠,獲取代理對(duì)象 
?            |--MapperProxyFactory#newInstance:調(diào)用JDK的動(dòng)態(tài)代理方式,創(chuàng)建Mapper代理
SqlSession執(zhí)行主流程

找入口:DefaultSqlSession#selectList()

DefaultSqlSession#selectList
?    CachingExecutor#query
?        BaseExecutor#query 委托給BaseExecutor執(zhí)行
?            #queryFromDatabase
?            SimpleExecutor#doQuery  執(zhí)行查詢
?                Configuration#newStatementHandler  創(chuàng)建路由功能的StatementHandler,根據(jù)MappedStatement中的StatementType
?            SimpleExecutor#prepareStatement  設(shè)置PreapreStatement 的參數(shù)
?            BaseExecutor#getConnection 獲取數(shù)據(jù)庫(kù)連接
?                BaseStatementHandler#prepare 創(chuàng)建Statement PrepareStatement、Statement、CallableStatement)
?                PreparedStatementHandler#parameterize 設(shè)置參數(shù)
?                PreparedStatementHandler#query 執(zhí)行SQL語(yǔ)句(已經(jīng)設(shè)置過(guò)參數(shù)),并且映射結(jié)果集
?                    com.mysql.jdbc.PreparedStatement#execute 調(diào)用JDBC的api執(zhí)行Statement
?                        DefaultResultSetHandler#handleResultSets  處理結(jié)果集

相關(guān)接口和類(lèi)

|--DefaultSqlSession 
|--Executor 
    |--CachingExecutor 
    |--BaseExecutor 
    |--SimpleExecutor 
|--StatementHandler 
    |--RoutingStatementHandler 
    |--PreparedStatementHandler 
|--ResultSetHandler 
    |--DefaultResultSetHandler 

?

BoundSql獲取流程

找入口:MappedStatement#getBoundSql方法

MappedStatement#getBoundSql
?    DynamicSqlSource#getBoundSql 
?        SqlSourceBuilder#parse 執(zhí)行解析:將帶有#{}的SQL語(yǔ)句進(jìn)行解析,然后封裝到StaticSqlSource中
?            GenericTokenParser  #構(gòu)造方法,指定待分析的openToken和closeToken,并指定處理器
?                GenericTokenParser#parse 解析SQL語(yǔ)句,處理openToken和closeToken中的內(nèi)容 
?                    ParameterMappingTokenHandler#handleToken 處理token(#{}/${})  
?                        #buildParameterMapping  創(chuàng)建 ParameterMapping對(duì)象
?                            StaticSqlSource#構(gòu)造方法 : 將解析之后的SQL信息,封裝到StaticSqlSource
|--RawSqlSource#getBoundSql 
?    |--StaticSqlSource#getBoundSql 
?        |--BoundSql#構(gòu)造方法:將解析后的sql信息、參數(shù)映射信息、入?yún)?duì)象組合到BoundSql對(duì)象中 
參數(shù)映射流程

找入口: 其實(shí)就是SqlSession執(zhí)行流程中的 PreparedStatementHandler#parameterize

|--PreparedStatementHandler#parameterize:設(shè)置PreparedStatement的參數(shù) 
?    |--DefaultParameterHandler#setParameters:設(shè)置參數(shù) 
?        |--BaseTypeHandler#setParameter: 
?            |--xxxTypeHandler#setNonNullParameter:調(diào)用PreparedStatement的setxxx方法
處理結(jié)果集

找入口:其實(shí)就是SqlSession執(zhí)行流程中的 DefaultResultSetHandler#handleResultSets

|--DefaultResultSetHandler#handleResultSets 
?    |--DefaultResultSetHandler#handleResultSet 
?        |--DefaultResultSetHandler#handleRowValues 
?            |--DefaultResultSetHandler#handleRowValuesForSimpleResultMap 
?                |--DefaultResultSetHandler#getRowValue 
?                    |--DefaultResultSetHandler#createResultObject:創(chuàng)建映射結(jié)果對(duì)象 
?                    |--DefaultResultSetHandler#applyAutomaticMappings 
?                    |--DefaultResultSetHandler#applyPropertyMappings 

基本上Mybatis的流程就是這樣了,其中還有很多實(shí)現(xiàn)細(xì)節(jié)暫時(shí)看不太懂。 我認(rèn)為學(xué)習(xí)框架源碼分為兩步:

抓住主線,掌握框架的原理和流程;

理解了處理思路之后,再去理解面向?qū)ο笏枷牒驮O(shè)計(jì)模式的用法;

目前第一步尚有問(wèn)題,需要多走幾遍源碼,加深下理解,一起加油~~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75639.html

相關(guān)文章

  • MyBatis 源碼分析系列文章合集

    摘要:簡(jiǎn)介我從七月份開(kāi)始閱讀源碼,并在隨后的天內(nèi)陸續(xù)更新了篇文章??紤]到超長(zhǎng)文章對(duì)讀者不太友好,以及拆分文章工作量也不小等問(wèn)題。經(jīng)過(guò)兩周緊張的排版,一本小小的源碼分析書(shū)誕生了。我在寫(xiě)系列文章中,買(mǎi)了一本書(shū)作為參考,這本書(shū)是技術(shù)內(nèi)幕。 1.簡(jiǎn)介 我從七月份開(kāi)始閱讀MyBatis源碼,并在隨后的40天內(nèi)陸續(xù)更新了7篇文章。起初,我只是打算通過(guò)博客的形式進(jìn)行分享。但在寫(xiě)作的過(guò)程中,發(fā)現(xiàn)要分析的代碼...

    Crazy_Coder 評(píng)論0 收藏0
  • Mybatis源碼分析(1) - Mybatis包目錄簡(jiǎn)介

    摘要:核心包包名稱(chēng)包內(nèi)內(nèi)容簡(jiǎn)介注解目錄。如等類(lèi)的實(shí)例反射生成工具目錄主要是注解,和的構(gòu)造器及轉(zhuǎn)換器內(nèi)部緩存接口。等默認(rèn)的游標(biāo)處理類(lèi)數(shù)據(jù)源工廠類(lèi)及實(shí)現(xiàn)。數(shù)據(jù)源實(shí)現(xiàn)類(lèi)自定義的三個(gè)異常類(lèi)。。都繼承自執(zhí)行器相關(guān)包。為后續(xù)分析源碼打下基礎(chǔ)。 Mybatis核心包 showImg(https://segmentfault.com/img/remote/1460000018747383?w=746&h=1...

    chengtao1633 評(píng)論0 收藏0
  • mybatis-plus源碼分析之sql注入器

    摘要:下面我會(huì)詳細(xì)地從源碼的角度分析下文簡(jiǎn)寫(xiě)成是如何實(shí)現(xiàn)自動(dòng)注入的原理。文件解析器,解析對(duì)應(yīng)的文件信息,并將文件信息注冊(cè)到中。節(jié)點(diǎn)解析器,用于構(gòu)建節(jié)點(diǎn)信息。注冊(cè)與綁定類(lèi),將的類(lèi)信息與綁定。 微信公眾號(hào)「后端進(jìn)階」,專(zhuān)注后端技術(shù)分享:Java、Golang、WEB框架、分布式中間件、服務(wù)治理等等。 老司機(jī)傾囊相授,帶你一路進(jìn)階,來(lái)不及解釋了快上車(chē)! mybatis-plus是完全基于myba...

    gougoujiang 評(píng)論0 收藏0
  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹(shù)打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無(wú)意間聽(tīng)到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹(shù)打卡?【打卡貼 day2...

    Scorpion 評(píng)論0 收藏0
  • Mybatis系列】從源碼角度深度理解Mybatis的緩存特性

    摘要:一級(jí)緩存介紹及相關(guān)配置。在這個(gè)章節(jié),我們學(xué)習(xí)如何使用的一級(jí)緩存。一級(jí)緩存實(shí)驗(yàn)配置完畢后,通過(guò)實(shí)驗(yàn)的方式了解一級(jí)緩存的效果。源碼分析了解具體的工作流程后,我們隊(duì)查詢相關(guān)的核心類(lèi)和一級(jí)緩存的源碼進(jìn)行走讀。 我,后端Java工程師,現(xiàn)在美團(tuán)點(diǎn)評(píng)工作。愛(ài)健身,愛(ài)技術(shù),也喜歡寫(xiě)點(diǎn)文字。個(gè)人網(wǎng)站: http://kailuncen.me公眾號(hào): KailunTalk (凱倫說(shuō)) 前言 本文主要涉及...

    Ku_Andrew 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<