本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到個人倉庫裏查看html
喜歡的話麻煩點下Star哈java
文章首發於個人我的博客:python
www.how2playlife.commysql
本文是微信公衆號【Java技術江湖】的《走進JavaWeb技術世界》其中一篇,本文部份內容來源於網絡,爲了把本文主題講得清晰透徹,也整合了不少我認爲不錯的技術博客內容,引用其中了一些比較好的博客文章,若有侵權,請聯繫做者。git
該系列博文會告訴你如何從入門到進階,從servlet到框架,從ssm再到SpringBoot,一步步地學習JavaWeb基礎知識,並上手進行實戰,接着瞭解JavaWeb項目中常常要使用的技術和組件,包括日誌組件、Maven、Junit,等等內容,以便讓你更完整地瞭解整個JavaWeb技術體系,造成本身的知識框架。爲了更好地總結和檢驗你的學習成果,本系列文章也會提供每一個知識點對應的面試題以及參考答案。程序員
若是對本系列文章有什麼建議,或者是有什麼疑問的話,也能夠關注公衆號【Java技術江湖】聯繫做者,歡迎你參與本系列博文的創做和修訂。github
文末贈送8000G的Java架構師學習資料,須要的朋友能夠到文末了解領取方式,資料包括Java基礎、進階、項目和架構師等免費學習資料,更有數據庫、分佈式、微服務等熱門技術學習視頻,內容豐富,兼顧原理和實踐,另外也將贈送做者原創的Java學習指南、Java程序員面試指南等乾貨資源)面試
<!-- more -->spring
在mybatis的基礎知識中咱們已經能夠對mybatis的工做方式窺斑見豹(參考:《MyBatis————基礎知識》)。
可是,爲何還要要學習mybatis的工做原理?由於,隨着mybatis框架的不斷髮展,現在已經愈來愈趨於自動化,從代碼生成,到基本使用,咱們甚至不須要動手寫一句SQL就能夠完成一個簡單應用的所有CRUD操做。
從原生mybatis到mybatis-spring,到mybatis-plus再到mybatis-plus-spring-boot-starter。spring在發展,mybatis一樣在隨之發展。
萬變的外表終將迷惑人們的雙眼,只要抓住核心咱們永遠不會迷茫!
用最直觀的圖,來征服你的心!
mybatis應用程序經過SqlSessionFactoryBuilder從mybatis-config.xml配置文件(也能夠用Java文件配置的方式,須要添加@Configuration)中構建出SqlSessionFactory(SqlSessionFactory是線程安全的);
而後,SqlSessionFactory的實例直接開啓一個SqlSession,再經過SqlSession實例得到Mapper對象並運行Mapper映射的SQL語句,完成對數據庫的CRUD和事務提交,以後關閉SqlSession。
說明:SqlSession是單線程對象,由於它是非線程安全的,是持久化操做的獨享對象,相似jdbc中的Connection,底層就封裝了jdbc鏈接。
詳細流程以下:
一、加載mybatis全局配置文件(數據源、mapper映射文件等),解析配置文件,MyBatis基於XML配置文件生成Configuration,和一個個MappedStatement(包括了參數映射配置、動態SQL語句、結果映射配置),其對應着<select | update | delete | insert>標籤項。
二、SqlSessionFactoryBuilder經過Configuration對象生成SqlSessionFactory,用來開啓SqlSession。
三、SqlSession對象完成和數據庫的交互: a、用戶程序調用mybatis接口層api(即Mapper接口中的方法) b、SqlSession經過調用api的Statement ID找到對應的MappedStatement對象 c、經過Executor(負責動態SQL的生成和查詢緩存的維護)將MappedStatement對象進行解析,sql參數轉化、動態sql拼接,生成jdbc Statement對象 d、JDBC執行sql。
e、藉助MappedStatement中的結果映射關係,將返回結果轉化成HashMap、JavaBean等存儲結構並返回。
MyBatis 是支持定製化 SQL、存儲過程以及高級映射的優秀的持久層框架,其主要就完成2件事情:
MyBatis的主要設計目的就是讓咱們對執行SQL語句時對輸入輸出的數據管理更加方便,因此方便地寫出SQL和方便地獲取SQL的執行結果纔是MyBatis的核心競爭力。
MyBatis框架和其餘絕大部分框架同樣,須要一個配置文件,其配置文件大體以下:
<configuration> <settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="false"/> <!--<setting name="logImpl" value="STDOUT_LOGGING"/> <!– 打印日誌信息 –>--> </settings> <typeAliases> <typeAlias type="com.luo.dao.UserDao" alias="User"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <!--事務管理類型--> <dataSource type="POOLED"> <property name="username" value="luoxn28"/> <property name="password" value="123456"/> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://192.168.1.150/ssh_study"/> </dataSource> </environment> </environments> <mappers> <mapper resource="userMapper.xml"/> </mappers> </configuration>
以上配置中,最重要的是數據庫參數的配置,好比用戶名密碼等,若是配置了數據表對應的mapper文件,則須要將其加入到<mappers>節點下。
以上主要成員在一次數據庫操做中基本都會涉及,在SQL操做中重點須要關注的是SQL參數何時被設置和結果集怎麼轉換爲JavaBean對象的,這兩個過程正好對應StatementHandler和ResultSetHandler類中的處理邏輯。
<sub>(圖片來自《深刻理解mybatis原理》 MyBatis的架構設計以及實例分析)</sub>
https://www.jianshu.com/p/e398435fc1c4 https://segmentfault.com/a/1190000015117926?utm_source=tag-newest#articleHeader4 http://www.javashuo.com/article/p-nqvtutzj-hq.html http://www.javashuo.com/article/p-eawdggfh-bg.html http://www.javashuo.com/article/p-yhnqmtzv-hx.html
黃小斜是跨考軟件工程的 985 碩士,自學 Java 兩年,拿到了 BAT 等近十家大廠 offer,從技術小白成長爲阿里工程師。
做者專一於 JAVA 後端技術棧,熱衷於分享程序員乾貨、學習經驗、求職心得和程序人生,目前黃小斜的CSDN博客有百萬+訪問量,知乎粉絲2W+,全網已有10W+讀者。
黃小斜是一個斜槓青年,堅持學習和寫做,相信終身學習的力量,但願和更多的程序員交朋友,一塊兒進步和成長!
原創電子書: 關注微信公衆號【黃小斜】後回覆【原創電子書】便可領取我原創的電子書《菜鳥程序員修煉手冊:從技術小白到阿里巴巴Java工程師》這份電子書總結了我2年的Java學習之路,包括學習方法、技術總結、求職經驗和麪試技巧等內容,已經幫助不少的程序員拿到了心儀的offer!
程序員3T技術學習資源: 一些程序員學習技術的資源大禮包,關注公衆號後,後臺回覆關鍵字 「資料」 便可免費無套路獲取,包括Java、python、C++、大數據、機器學習、前端、移動端等方向的技術資料。
若是你們想要實時關注我更新的文章以及分享的乾貨的話,能夠關注個人微信公衆號【Java技術江湖】
這是一位阿里 Java 工程師的技術小站。做者黃小斜,專一 Java 相關技術:SSM、SpringBoot、MySQL、分佈式、中間件、集羣、Linux、網絡、多線程,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!
(關注公衆號後回覆」Java「便可領取 Java基礎、進階、項目和架構師等免費學習資料,更有數據庫、分佈式、微服務等熱門技術學習視頻,內容豐富,兼顧原理和實踐,另外也將贈送做者原創的Java學習指南、Java程序員面試指南等乾貨資源)
Java工程師必備學習資源: 一些Java工程師經常使用學習資源,關注公衆號後,後臺回覆關鍵字 「Java」 便可免費無套路獲取。