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