Mybatis基本原理及框架設計流程

2021-10-09 15:46:10 字數 2543 閱讀 5693

前言:本文主要闡述mybatis中的核心原理,省略了其他跟核心原理相對來說沒那麼重要的部分。

先來一段mybatis的簡單使用**:

public class userdaotest  catch (ioexception e) 

sqlsession sqlsession = sessionfactory.opensession();

assert.assertnotnull("沒找到資料", user);

}}

上面是我在網上隨便找的一段mybatis的簡單使用步驟,我們就根據上述**來分析一下mybatis的實現過程。

第一步:首先框架肯定需要去獲取使用者配置的檔案(sqlmapconfig.xml)並解析,這裡先寫兩個必要的配置資訊:

了解完兩個基礎的物件之後,我們開始繼續分析,下面就應該是解析使用者配置檔案:

public class sqlsessionfactorybuilder  catch (exception e)  finally  catch (ioexception e) 

}} public sqlsessionfactory build(configuration config)

}

第二步:獲取到了sqlsessionfactory,我們就可以直接用sqlsessionfactory.openseession來獲取sqlsession物件。

這一步可以說是mybatis原理中比較重要的一步了,在前面的描述中,我們已經知道了在構建sqlsessionfactory的時候需要configuration 物件,因此sqlsessionfactory就持有了configuration物件,然後在呼叫opensession()的時候,configuration物件也會被當做入參繼續傳遞下去,關鍵**如下圖:

public class defaultsqlsessionfactory implements sqlsessionfactory 

public sqlsession opensession()

}

接續跟進opensessionfromdatasource方法:

private sqlsession opensessionfromdatasource(executortype exectype, transactionisolationlevel level, boolean autocommit)  catch (exception e)  finally 

}

我們可以發現在opensessionfromdatasource方法中,configuration物件會產生乙個執行器executor ,並且這個executor 物件是作為的defaultsqlsession的建構函式的入參,進入defaultsqlsession,我們可以看到任意找乙個增刪查改的方法,底層都是呼叫的這個executor物件來執行,

public class defaultsqlsession implements sqlsession 

//查詢方法

public listselectlist(string statement, object parameter, rowbounds rowbounds) catch (exception e) finally

}}

繼續跟進去executor.query()方法,找到executor的乙個實現類baseexecutor,可以看到以下**

resulthandler resulthandler) throws sqlexception

ms.getboundsql()的作用就是解析組裝sql,boundsql物件就可以看做成一條已經可以執行的sql;

createcachekey()的作用就是看這次查詢的結果是否已經有過快取,關於mybatis的一級快取和二級快取,篇幅問題就下次在寫吧。。

繼續跟baseexecutor.query(ms, parameter, rowbounds, resulthandler, key, boundsql),找到******executor,

statement stmt = null;

try finally

} 中間省略繼續跟進的過程。。。總之也就是jdbc中過程,最後我們關注到如何把查詢出來的結果集轉換成我們的實體物件的,最後定位到defaultresultsethandler的handleresultsets方法。

public listhandleresultsets(statement stmt) throws sqlexception 

if (resultsets != null)

rsw = getnextresultset(stmt);

cleanupafterhandlingresultset();

resultsetcount++;}}

return collapsesingleresultlist(multipleresults);

}

未完待續。。。。

ssh框架基本原理

由ssh構建系統的基本業務流程是 1 在表示層中,首先通過jsp頁面實現互動介面,負責傳送請求 request 和接收響應 response 然後struts根據配置檔案 struts config.xml 將actionservlet接收到的request委派給相應的action處理。2 在業務層...

Spring框架的基本原理

一 spring基本概念 1 struts2是web框架,hibernate是orm框架 2 spring是容器框架,建立bean,維護bean之間的關係 3 spring可以管理web層,持久層,業務層,dao層,spring可以配置各個層的元件,並且維護各個層的關係 二 spring核心原理 1...

Angular框架的基本原理

最近公司在研發新的web平台,對於前端的開發最終選定使用angular框架進行開發,而經過這一段時間的學習與研究,基本可以使用其進行前端業務的開發,在此將angular框架的基本原理知識進行簡單總結,並使用primeng元件庫來實現簡單的應用開發,這裡說的是指angular2以後的版本。1 angu...