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