您好,登錄后才能下訂單哦!
這篇文章主要講解了“mybatis的運(yùn)行原理和查詢實(shí)現(xiàn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“mybatis的運(yùn)行原理和查詢實(shí)現(xiàn)”吧!
mybatis接口是編程是利用jdk動(dòng)態(tài)來實(shí)現(xiàn)的
1.代理對(duì)象不管執(zhí)行哪個(gè)方法都會(huì)執(zhí)行mapperProxy的invoke方法,判斷當(dāng)前執(zhí)行器的方法是否是Object類的方法,因?yàn)榇韺?duì)象的方法一部分是從需要代理的接口中實(shí)現(xiàn)過來的,另一部分是Object里面的方法比如equals、toString等方法。
2.接著將Method包裝成MapperMethod對(duì)象,該對(duì)象包含sqlCommand和MegthodSignature兩個(gè)對(duì)象,sqlCommand(在初始該對(duì)象傳入Configuration,接口的Class對(duì)象,Method進(jìn)行初始化,調(diào)用自身的resolveMappedStatement方法獲取拼接statementId,即接口的全路徑名+方法名,調(diào)用Configuration.getMappedStatement方法獲取MappedStatement對(duì)象,該對(duì)象維護(hù)了一條<select|update|delete|insert>節(jié)點(diǎn)的封裝,這邊很容看出sqlCommand初始化傳入這三個(gè)參數(shù)的作用了,MegthodSignature存儲(chǔ)了當(dāng)前要調(diào)用方法的詳細(xì)信息。
3.MapperMethod調(diào)用execute方法傳入sqlsession和方法參數(shù),先通過sqlCommand判斷當(dāng)前語句的類型。這里我們先講查詢返回對(duì)象的情況,mybatis會(huì)通過MegthodSignature對(duì)象判斷當(dāng)前要執(zhí)行的方法返回的條數(shù)和類型,去執(zhí)行相對(duì)應(yīng)的方法。首先調(diào)用convertArgsToSqlCommandParam對(duì)當(dāng)前執(zhí)行的方法參數(shù)的解析,接著調(diào)用defaultSqlSession.selectOne(command.getName(), param)的方法。這里的command.getName()的值是statementId也就是我們開發(fā)配置的namespace加對(duì)應(yīng)語句的id
這里來分析selectList方法,截圖如下:
首先通過statement,(其實(shí)就是我們剛剛上面所說的statementId)從configuration獲取MappedStatement對(duì)象。MappedStatement包裝當(dāng)前運(yùn)行方法對(duì)應(yīng)的sql語句以及其類型。接著調(diào)用executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER)
進(jìn)一層包裝執(zhí)行方法的參數(shù),邏輯分頁對(duì)象以及MappedStatement對(duì)象。傳入該方法中,調(diào)用CachingExecutor這個(gè)執(zhí)行器里面query方法,判斷當(dāng)前是否有配置緩存。沒有緩存默認(rèn)調(diào)用SimpleExecutor里面的query方法。繼續(xù)查看simpleExecutor.query方法,該方法會(huì)先從本地緩存中也就是一級(jí)緩存中查詢當(dāng)前的要查詢的接口。mybatis通生成緩存key來唯一判斷當(dāng)前的查詢是否和之前的查詢一致,一致則從緩存中取。(分析到這里我們可以發(fā)現(xiàn)mybatis會(huì)先查二級(jí)緩存,再查一級(jí)緩存)。
進(jìn)入doQuery方法,聲明原生jdbc的Statement 對(duì)象。獲取全局配置信息Configuration,new一個(gè)StatementHandler對(duì),也就是mybatis的四大對(duì)象之一。
prepareStatement方法主要獲取connection,也就是數(shù)據(jù)庫連接對(duì)象。最終調(diào)用底層的數(shù)據(jù)查詢,并將查詢接口交給ResultSetHandler進(jìn)行封裝。
感謝各位的閱讀,以上就是“mybatis的運(yùn)行原理和查詢實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)mybatis的運(yùn)行原理和查詢實(shí)現(xiàn)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。