1. 程式人生 > >mybatis系統學習(五)——mybatis原始碼之內部基本處理流程

mybatis系統學習(五)——mybatis原始碼之內部基本處理流程

mybatis使用中的模組互動

在之前的學習中我們知道了,一個簡單的基礎mybatis專案基本會包含如下幾個必要的部分:
這裡寫圖片描述
從上圖中可以清晰的看到,整個資料的走向最終是指向了業務類,也就是說無論是配置還是介面,還是依賴包,最終的作用都是為了業務,為了解決實際問題。
同時,mybatis.xml配置檔案和業務類,以及mapper.xml對映檔案都需要依賴包的支援,因為裡邊的類或者標籤需要用到mybatis封裝的類。
之後,mapper.xml對映檔案也指向了mybatis.xml,意思是在mybatis.xml檔案中需要指定對映檔案,否則相應的mapper對映便沒有被引用,也就無效。
而之後的資料實體類和資料操作介面又都指向了mapper.xml,意思是mapper裡的配置就是資料和介面的整合,從而成為具體的實現。

上邊整理的圖中各模組內容的互動,我覺得可以看成是實際開發專案中需要我們自己處理的內容互動,這些基本都還是處理用的階段。
那麼接下來要說的,就是mybatis內部的實現,看一看mybatis裡邊是如何整合和執行的。

mybatis執行時內部流程

程式執行,首先會進入程式入口,我們之前的例子中就是實際的業務處理類,也就是測試類,裡邊的主要程式碼回顧如下:

InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List list = userMapper.findUsers();

上邊的程式碼沒有分支,就是一個簡單的順序結構。順序結構的程式執行時從上往下,但為了分析出執行過程中的關鍵點,我決定從下往上來看。

那麼首先是最後一行,這裡邊要關注的點,很顯然是變數userMapper,需要知道他是怎麼被初始化賦值的;
往上看就會看到userMapper是從sqlSession中get出來的,那麼很顯然,userMapper應該在sqlSession中初始化的。
但是進一步分析就會發現SqlSession 是一個介面,那麼這個初始化就應該是在他的子類中。
SqlSession子類是誰呢?以上的步驟無法確定,所以沒辦法就只能繼續往上看。

這時候會看到SqlSession是從SqlSessionFactory 中拿到的,使用了SqlSessionFactory 的openSession方法。
但是再進一步分析會發現和SqlSession 一樣,SqlSessionFactory也是一個介面,那麼很顯然需要繼續確定SqlSessionFactory的執行中的子類。

然後就看到SqlSessionFactory是通過SqlSessionFactoryBuilder的build方法初始化的,就需要進入build看個究竟。
進入build之後,發現首先是根據傳入的輸入流建立了一個XMLConfigBuilder物件,在XMLConfigBuilder中給了configuration、parsed、environment、parser四個變數賦值。
之後繼續呼叫過載的build方法返回了一個DefaultSqlSessionFactory,這個時候還呼叫了XMLConfigBuilder的parse方法,在parse方法中初始化了很多資料,其中就包括瞭解析mapper,這裡先放下不提。
需要提的是,終於找到了第一確定的類:DefaultSqlSessionFactory。

既然這樣,接下來就可以倒回去看,上邊說SqlSession是從SqlSessionFactory 中拿到的,現在可以確定實際是從DefaultSqlSessionFactory中拿的,也就是使用了DefaultSqlSessionFactory的openSession方法。
在openSession中就會看到最後返回了一個DefaultSqlSession。

找到了SqlSession的具體子類,那麼就能回到最初的問題,userMapper是如何被初始化的。
在DefaultSqlSession的getMapper方法中會看到,裡邊又呼叫了configuration的getMapper方法。
那麼再進一步分析,userMapper實際應該是在configuration裡邊初始化的,再進入configuration的getMapper方法,會看到又呼叫了mapperRegistry的getMapper方法,最終發現是從mapperRegistry類的knownMappers變數中取出來的userMapper。

那麼這時候需要解決的問題,就是userMapper是怎麼被加入到knownMappers中的呢?
經過在Configuration查詢,會發現有一個addMapper方法,正是這裡邊的處理,使得userMapper加入了knownMappers中。
那麼這個addMapper又是什麼時候呼叫的,在哪裡呼叫的呢?回想一下上邊會發現,在SqlSessionFactoryBuilder的build的時候,有一個parse步驟,裡邊解析了mapper,然後正好就是呼叫了Configuration的addMappers方法,最終呼叫addMapper方法。

那麼到這裡,整個mybatis執行時內部處理的基本脈絡就相對清晰了,可以初步整理為如下圖所示的流程:
這裡寫圖片描述

相關推薦

mybatis系統學習——mybatis原始碼內部基本處理流程

mybatis使用中的模組互動 在之前的學習中我們知道了,一個簡單的基礎mybatis專案基本會包含如下幾個必要的部分: 從上圖中可以清晰的看到,整個資料的走向最終是指向了業務類,也就是說無論是配置還是介面,還是依賴包,最終的作用都是為了業務,為了解決實

MyBatis學習——關聯對映主鍵對映

一、主鍵對映的作用 當資料插入操作不關心插入後資料的主鍵(唯一標識),那麼建議使用 不返回自增主鍵值 的方式來配置插入語句,這樣可以避免額外的SQL開銷. 當執行插入操作後需要立即獲取插入的自增主鍵值,比如一次操作中儲存一對多這種關係的資料,那麼就要使用插入後獲取自增主鍵值的方式配置.

mybatis系統學習——使用基礎mybatis代替原始jdbc

前言 這一篇筆記的內容應當是建立在上一篇的基礎之上,不論是使用的資料表,還是對應的實體類,都在上一篇有過說明。 有興趣的或者對相應內容有疑問的,可移步: https://blog.csdn.net/tuzongxun/article/details/800

mybatis系統學習——jdbc基礎和mybatis

說明 這一次我所想要做的事,是系統的學習一下mybatis,結合官網文件以及各種網路資料和以往實踐經驗。 既然是系統的學,就免不了需要了解他所要解決的事情。 據我目前的理解,作為一個持久層框架,mybatis歸根結底解決的問題其實就是jdbc那幾句話的問題

MyBatis學習——關聯對映多對多關聯

本次多對多關聯在之前進行的一對一和一對多關聯基礎之上進行。 需求:根據班級課程查詢選修學生資訊 新建課程表和課程表與學生表的中間表 建立Course實體類: package com.little.entity; import java.util.ArrayL

MyBatis學習——關聯對映一對一關聯

一對一關聯中主要需要在介面實現配置檔案中使用到標籤元素association 需求: 根據班級id查詢班級資訊(帶老師的資訊) 建立一張教師表和班級表,這裡我們假設一個老師只負責教一個班,那麼老師和班級之間的關係就是一種一對一的關係 建立teacher實體類:

MyBatis學習——MyBatis動態SQL

一、動態SQL介紹 MyBatis 的強大特性之一便是它的動態 SQL。如果有使用 JDBC 或其他類似框架的經驗,就能體會到根據不同條件拼接 SQL 語句有多麼痛苦。拼接的時候要確保不能忘了必要的空格,還要注意省掉列名列表最後的逗號。利用動態 SQL 這一特性可以徹底擺脫這種痛苦。

MyBatis學習——MyBatis事務核心物件及配置

一、獲取SqlSession物件 MyBatis框架中涉及到的幾個API SqlSessionFactoryBuilder:該物件負責根據MyBatis配置檔案mybatis-config.xml構建SqlSessionFactory例項  負責生產session SqlSes

MyBatis學習——MyBatis介紹及實現CRUD操作

一、MyBatis介紹 MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。 IBATIS一詞來源於“inter

HLS學習HLSDownloader原始碼分析4解析Master PlayList

解析Master PlayList     PlayList就是m3u8檔案或者索引檔案,Master PlayList也叫一級索引檔案。 解析Master PlayList的過程如下: 1、

MyBatis學習

形式 string rom tag pda throws when reac 剔除 視頻觀看地址:http://edu.51cto.com/course/14674.html?source=so 1、動態sql 1.1、if 需求:查詢全部用戶,如果用戶填寫了姓名,按照姓名

mybatis學習筆記- MyBatis 對映檔案(引數處理)

注意:本篇筆記內容承接上一篇 引數處理 1. 單個引數&多個引數&命名引數 簡介 單個引數:mybatis不會做特殊處理, #{引數名/任意名}:取出引數值。 多個引數:mybatis會做特殊處理。

Mybatis學習————— 延遲載入和快取機制(一級二級快取)

一、延遲載入     延遲載入就是懶載入,先去查詢主表資訊,如果用到從表的資料的話,再去查詢從表的資訊,也就是如果沒用到從表的資料的話,就不查詢從表的資訊。所以這就是突出了懶這個特點。真是懶啊。     Mybatis中resultMap可以實現延遲載入     1.1、查詢訂單資訊,延遲載入使用者資訊

Java框架學習_MybatisMybatis架構體系

1、Mybatis架構體系(面試可能會問): 和其他框架一樣,Mybatis也需要也配置檔案SqlMapConfig.xml核心配置,裡面對應每一個表會有很多的mappers配置 用SqlSessionFactoryBuilder類的build方法建立一個SqlSessio

MyBatis 學習 一對一對映 一對多對映

案例使用兩張表 一張user使用者表 對映關係分析 首先,站在訂單的角度考慮: 一張訂單對應一個使用者,這是一對一 然後,站在使用者的角度考慮: 一個使用者可以有多個訂單,這是一對多 那麼SQL語句該如何寫? 還記得外

mybatis-spring的集成

setting bsp left gre body href ref 不起作用 pack mybatis-spring的集成   源碼下載(數據庫使用derby,具體數據庫結構參考這裏)   在src下新建applicationContext.xml   配置內容:數據源、

linux菜鳥基礎學習 系統日誌

unix 18C 關閉 系統 0.11 cron rate 保存 日誌類 系統日誌 1.系統日誌默認分類 /var/log/messages ##系統服務及日誌,包括服務的信息,報錯等等/var/log/secure ##系統認證信息日誌/var/log/mai

【筆記】Mybatis高階查詢--使用resultMap的<collection>進行巢狀查詢及延遲載入

下面例子通過<collection>實現一個通過使用者編號查詢使用者下面的角色及許可權的需求,支援延遲載入。下面以自下而上的過程來實現這樣的巢狀查詢功能。並且這個自下而上的過程中每一個方法都是獨立可用的方法。上層的結果都以下層方法為基礎。所有物件都設定為延遲載入。

Linux學習——系統資訊相關命令

系統資訊相關命令 本節內容主要是為了方便通過遠端終端維護伺服器時,檢視伺服器上當前 系統日期和時間 / 磁碟空間佔用情況 / 程式執行情況 本小結學習的終端命令基本都是查詢命令,通過這些命令對系統資源的使用情況有個瞭解 目標 時間和日期 date

mybatis 詳解------動態SQL

調用 otherwise efi 實例 其中 參數 sep 引用 完成 目錄 1、動態SQL:if 語句 2、動態SQL:if+where 語句 3、動態SQL:if+set 語句 4、動態SQL:choose(when,otherwise) 語句 5、動態SQL:tr