網際網路輕量級框架SSM-查缺補漏第七天(MyBatis的解析和執行原理
第七章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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4650/viewspace-2819614/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C# 執行緒查漏補缺C#執行緒
- C# 執行緒同步查漏補缺C#執行緒
- Typescript 查缺補漏TypeScript
- MyBatis的解析和執行原理MyBatis
- 《Java EE網際網路輕量級框架整合開發》讀書筆記Java框架筆記
- JavaScript Promise查缺補漏JavaScriptPromise
- Flutter查漏補缺1Flutter
- ROS灰灰的日常查漏補缺ROS
- iOS 查漏補缺 - PerformSelectoriOSperformSelector
- 深入淺出MyBatis:MyBatis解析和執行原理MyBatis
- C++灰灰的日常查漏補缺C++
- 【查漏補缺】那些漏掉的面試知識面試
- shell基礎知識查缺補漏
- asp.net core 2.0 查缺補漏ASP.NET
- 前端面試查漏補缺--(一) 防抖和節流前端面試
- 前端面試查漏補缺--(十三) 記憶體洩漏前端面試記憶體
- 前端面試查漏補缺--(十五) Event Loop前端面試OOP
- 前端面試查漏補缺--(八) 前端加密前端面試加密
- SLAM 灰灰restudy及查漏補缺—octomapSLAMREST
- 技術棧查漏補缺——架構師架構
- 查漏補缺(C++筆試)(更新中)C++筆試
- 適合移動端的輕量級網路
- 查漏補缺,盤點和toggle相關的幾個APIAPI
- 一個工業級、跨平臺、輕量級的 tcp 網路服務框架:geventTCP框架
- core_framework —— 基於libev的輕量級lua網路開發框架Framework框架
- 5個替代Apache和IIS的輕量級網路伺服器Apache伺服器
- 替代Apache和IIS的輕量級網路伺服器盤點Apache伺服器
- 網際網路—年輕的戰場
- 網際網路級別的RPC框架:谷歌的gRPC開源框架RPC框架谷歌
- 輕量級卷積神經網路的設計卷積神經網路
- Facebook在NAS領域的輕量級網路探索
- 前端面試查漏補缺--(十) 前端鑑權前端面試
- [學習筆記]TypeScript查缺補漏(一):類筆記TypeScript
- 「查缺補漏」鞏固你的Redis知識體系Redis
- eMarketer:調查顯示83%的中東和北非年輕網民每天使用網際網路
- 中國的網際網路審查
- 輕量級卷積神經網路的設計技巧卷積神經網路
- Redis基礎你掌握多少了?來查漏補缺?Redis