網際網路輕量級框架SSM-查缺補漏第七天(MyBatis的解析和執行原理

joytoy發表於2021-09-09

第七章MyBatis的解析和執行原理

  SqlSessionFactory是MyBatis的核心類之一,其最重要的功能就是提供建立MyBatis的核心藉口SqlSession,所以要先建立SqlSessionFactory,為此要提供配置檔案和相關的引數。MyBatis是一個複雜的系統,它採用了Builder模式去建立SqlSessionFactory,在實際上可以透過SqlSessionFactoryBuilder去建立,分為兩步:

  

SqlSessionFactory = new SqlSessionFactoryBuider().build(inputStream);

圖片描述

  • 第一步透過org.apache.ibatis.builder.xml.XMLConfigBuilder解析配置XML檔案,讀取所有配置引數,並將讀取的內容裝入org.apache.ibatis.session.Configuration類物件中。而Configuration採用的事單例模式,幾乎所有的MyBatis配置內容都會存放在這個單例物件中,以便後續將這些內容讀出。

  • 第二步使用Configuration物件建立SqlSessionFactory,MyBatis中SqlSessionFactory是一個介面,而不是一個實現類,為此MyBatis提供一個預設的實現類org.apache.ibatis.session.defaults.DefaultSqlSessionFactory。在大部分情況下都沒有必要自己去建立新的SqlSessionFactory實現類。

  對映器的內部組成:

  當XMLConfigBuilder解析XML時,會將每一個SQL和其配置的內容儲存起來。一般而言,在MyBatis中一條SQL和它相關的配置資訊是由3個部分組成閥門分別是MappedStatement、SqlSource和BoundSql。

圖片描述

 

  • MappedStatement:的作用是儲存一個對映器節點(select|insert|delete|update)的內容。他是一個類,包括許多我們配置的SQL、SQL的id、快取資訊、resultMap、parameterType、resultType、resultMap、languageDriver等重要配置內容。她還有一個重要的屬性sqlSource,MyBatis透過讀取它來獲取某條SQL配置的所有資訊。

  • sqlSource:提供BoundSql陪物件的地方,他是MappedStatement的一個屬性。它是一個介面。自定義了一個介面方法getBoundSql(parameterObject),使用它可以得到一個BoundSql物件。

  • BoundSql:是一個結果物件,對於最終的引數和SQL都反映在BoundSql類物件上。BoundSql有三個主要的屬性:parameterMappings、parameterObject和sql

    • parameterObject:為引數本身,可以傳遞簡單物件、POJO或者Map

    • parameterMappings是一個List,它的每一個元素都是ParameterMapping物件。物件會描述引數,引數包括屬性名稱、表示式、javaType、jdbcType、typrHandler等重要資訊

    • sql屬性就是書寫在對映器裡面的一條被SqlSource解析後的SQL

  SqlSession執行過程

  注:這裡的程式碼作為例子。圖為程式碼執行過程的流程圖。

  圖片描述

  SqlSession處理SQL的過程:透過StatementHandler、ParameterHandler和ResultSetHandler來完成資料庫操作和結果的返回。

  • Executor:代表執行器,由他來排程其他物件來執行對應的SQL。SqlSession其實是一個門面,真正幹活的是執行器,它是一個真正執行Java和資料庫互動的物件。

  • StatementHandler:作用是使用資料庫的Statement(例如PreparedStatement)執行操作,它很重要。

  • ParameterHandler:是用來處理SQL引數的。

  • ResultSetHandler:是進行資料集(ResultSet)的封裝返回處理的。

圖片描述

  總結:SqlSession內部執行圖如下:

圖片描述

  • prepared預編譯SQL

  • parameterize設定引數

  • query/update執行SQL

原文出處:https://www.cnblogs.com/shiboinfo/p/10209758.html  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4650/viewspace-2819614/,如需轉載,請註明出處,否則將追究法律責任。

相關文章