面試官 你分析過mybatis工作原理嗎?

2021-09-24 02:47:16 字數 4245 閱讀 8759

mybatis工作原理也是面試的一大考點,必須要對其非常清晰,這樣才能懟回去。本文建立在spring+springmvc+mybatis整合的專案之上。

我將其工作原理分為六個部分:

讀取核心配置檔案並返回inputstream流物件。

根據inputstream流物件解析出configuration物件,然後建立sqlsessionfactory工廠物件

根據一系列屬性從sqlsessionfactory工廠中建立sqlsession

從sqlsession中呼叫executor執行資料庫操作&&生成具體sql指令

對執行結果進行二次封裝

提交與事務

先給大家看看我的實體類:

讀取核心配置檔案

1.1 配置檔案mybatis-config.xml

<?xml version="1.0" encoding="utf-8"?>

1.3 main方法

從 xml 檔案中構建 sqlsessionfactory 的例項非常簡單,建議使用類路徑下的資源檔案進行配置。但是也可以使用任意的輸入流(inputstream)例項,包括字串形式的檔案路徑或者 file:// 的 url 形式的檔案路徑來配置。

mybatis 包含乙個名叫 resources 的工具類,它包含一些實用方法,可使從 classpath 或其他位置載入資源檔案更加容易。

public class main

}這個**是根據mybatis官方提供的乙個不使用 xml 構建 sqlsessionfactory的乙個demo改編的。

注意:是官方給的乙個不使用 xml 構建 sqlsessionfactory的例子,那麼我們就從這個例子中查詢入口來分析。

2. 根據配置檔案生成sqlsessionfactory工廠物件

2.1 resources.getresourceasstream(resource);原始碼分析

resources是mybatis提供的乙個載入資源檔案的工具類。

我們只看getresourceasstream方法:

public static inputstream getresourceasstream(string resource) throws ioexception

getresourceasstream呼叫下面的方法:

inputstream getresourceasstream(string resource, classloader classloader)

if (null != returnvalue)

}}值的注意的是,它返回了乙個inputstream物件。

2.2 new sqlsessionfactorybuilder().build(inputstream);原始碼分析

public sqlsessionfactorybuilder()

所以new sqlsessionfactorybuilder()只是建立乙個物件例項,而沒有物件返回(建造者模式),物件的返回交給build()方法。

public sqlsessionfactory build(inputstream inputstream)

這裡要傳入乙個inputstream物件,就是將我們上一步獲取到的inputstream物件傳入。

public sqlsessionfactory build(inputstream inputstream, string environment, properties properties) catch (exception var14) finally catch (ioexception var13)

}return var5;}

如何解析的就大概說下,通過document物件來解析,然後返回inputstream物件,然後交給xmlconfigbuilder構造成org.apache.ibatis.session.configuration物件,然後交給build()方法構造程sqlsessionfactory:

public sqlsessionfactory build(configuration config)

public defaultsqlsessionfactory(configuration configuration)

3. 建立sqlsession

sqlsession 完全包含了面向資料庫執行 sql 命令所需的所有方法。你可以通過 sqlsession 例項來直接執行已對映的 sql 語句。

public sqlsession opensession()

呼叫自身的opensessionfromdatasource方法:

getdefaultexecutortype()預設是******。

注意tx等級是 null, autocommit是false。

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

return var8;}

構建步驟:

environment>>transactionfactory+autocommit+tx-level>>transaction+exectype>>executor+configuration+autocommit>>sqlsession

其中,environment是configuration中的屬性。

呼叫executor執行資料庫操作&&生成具體sql指令

在拿到sqlsession物件後,我們呼叫它的insert方法。

public int insert(string statement, object parameter)

它呼叫了自身的update(statement, parameter)方法:

return var4;
然後呼叫baseexecutor中的update方法:

int var6;

try finally

return var6;

}

先來看看preparestatement方法,看看mybatis是如何將sql拼接合成的:

private statement preparestatement(statementhandler handler, log statementlog) throws sqlexception

來看看parameterize方法:

public void parameterize(statement statement) throws sqlexception

這裡把statement轉換程preparedstatement物件,它比statement更快更安全。

這都是我們在jdbc中熟用的物件,就不做介紹了,所以也能看出來mybatis是對jdbc的封裝。

if (value == null && jdbctype == null)

try catch (typeexception var10) catch (sqlexception var11)

}}}

}5. 對查詢結果二次封裝

提交與事務

最後,來看看commit()方法的原始碼。

public void commit()

呼叫其物件本身的commit()方法:

public void commit(boolean force) catch (exception var6) finally

}如果dirty是false,則進行回滾;如果是true,則正常提交。

private boolean iscommitorrollbackrequired(boolean force)

呼叫cachingexecutor的commit方法:

public void commit(boolean required) throws sqlexception

呼叫baseexecutor的commit方法:

public void commit(boolean required) throws sqlexception else

}
}

最後呼叫jdbctransaction的commit方法:

public void commit() throws sqlexception

// 提交連線

this.connection.commit();}}

demo參考文件

面試你的面試官

大多數面試都是面試官從簡歷,學歷,經歷,技術,為人上對你 乙個求職者 一番拷問,以確定是否是他們想要的人。而這些對找到適合你的工作的確沒什麼用。某公司某職位需要你,而某公司某職位不一定是你想要的!如果你想找到適合你的公司 如果你想找到適合你的職位 記得面試你的面試官,沒錯!做出很重要的職業決定前,面...

「簡歷造假,面試坦白」如果你是面試官給過嗎?

最近公司想招一名做c c linux服務端開發的開發。要求是 1.3年以上linux後台開發相關經驗。2.精通tcp ip協議棧。對os和體系結構由深刻理解。3.熟悉linux核心及各基礎模組,有提交核心patch優先。4.有開源專案貢獻經驗優先,對技術新動向有敏銳的嗅覺。5.會分布式 高併發優先。...

面試時,你會問面試官哪些問題?

明天又要去參加一次面試。每次面試的時候,面試官都會在最後給面試者一些時間,來問問題。這是個非常好的機會,能按照自己的思路,來了解職位 技 術 企業文化 福利待遇 企業狀況和前景等情況,以彌補前面面試過程中沒有了解到的情況。但較早以前面試準備不太充分,雖然也能地問上一些問題,但掛一漏 萬,每次回來後,...