Mybatis運行原理(帶你三步走)

Mybatis運行原理(帶你三步走)

官網地址:http://www.mybatis.org/mybatis-3/zh/getting-started.html

第一步:初始化階段,解析並加載到Configuration實例中。

  • 讀取xml配置文件和註解中的配置信息,創建配置對象,並完成各個模塊的初始化工作。

每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的實例爲中心的。SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 獲得。而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個預先定製的 Configuration 的實例構建出 SqlSessionFactory 的實例。

源碼解讀入口:

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

其中:
XMLConfigBuilder:解析mybatis-config.xml文件。
XMLMapperBuilder:解析所有的*mapper.xml文件。
XMLStatementBuilder:解析SQL語句(select|insert|update|delete)。

以上解析的文件均加載到Configuration實例中。

第二步:代理階段
使用jdk動態代理,封裝IBatis編程模型,找到訪問數據庫時對應的方法及傳參

  • 創建SqlSession響應請求
  • 動態代理封裝iBatis的編程模型
  • 使用mapper接口訪問數據庫

源碼解析入口:

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  Blog blog = mapper.selectBlog(101);
} finally {
  session.close();
}

翻譯過程:

在這裏插入圖片描述

找到session中對應的方法執行 <<<----- MapperMethod.SqlCommand.type + MapperMethod.MethodSignature.returnType
找到命名空間和方法名 <<<----- MapperMethod.SqlCommand.name
傳遞參數 <<<----- MapperMethod.MethodSignature.convertArgsToSqlCommandParam

第三步:數據讀寫階段
遵循jdbc規範,通過SqlSession完成SQL的解析,參數的映射,SQL的執行、結果的解析過程。
Mybatis的四大對象:
Executor:通過對SimpleExecutor doQuery()方法的解讀發現,Executor是調度器。
StatementHandler:它的作用是使用數據庫的Statement或PrepareStatement執行操作,起承上啓下作用。
ParameterHandler:對預編譯的SQL語句進行參數設置。
ResultSetHandler:對數據庫返回的結果集(ResultSet)進行封裝,返回用戶指定的實體類型。

TransactionalCache:二級緩存
PerpetualCache:一級緩存
注:數據查詢時,先從二級緩存取數據,若取不到則再從一級緩存中取數據(這是MySQL規定),若一級緩存中再獲取不到,則從數據庫中取數據。

Executor內部運作過程:
在這裏插入圖片描述

以上只是梳理Mybatis大致處理流程,像Mybatis緩存機制等還未整理,後期會補上這塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章