看到Mybatis源碼就感到煩躁,怎麼辦?

2020-12-14 田維常

背景

最近,聽到很多吐槽:看到源碼,心中就感到十分糾結、特別煩惱。

為什麼糾結?

因為面試的時候,面試官很喜歡問:你看過什麼框架源碼?JDK源碼也行。

這時候,如果回答沒有看過,雖然沒讓你立馬回去等通知。但也許,你在面試官心中的印象就大打折扣了。

如果回答看過,並且還能較為流利地說上一番,那面試官或許會在心裡讚嘆:小夥子可以呀!(PS:很多面試官自己也沒看過,或者看過很多也忘了)。

總之,你要是能說上個123,那給面試官的印象就會槓槓滴好。何愁工作?何愁加薪?

為什麼煩?

大部分人的情況是:源碼不是沒有看過,而是每次只看得下一部分。為什麼只看得下一部分呢?通常有下面三種原因:

缺乏技術支撐。看源碼是需要技術支撐的,不是隨便一個小白也能看懂的。沒有一些技術支撐,你頂多看看一小段,然後就看不下去,於是就放棄了。缺乏正確心態。看源碼確實挺無聊的,如果大家心態沒放好,把它當做一種任務去做,肯定覺得無聊,而且很容易放棄。缺乏足夠時間。確實很忙,經常看了一部分後,天天加班,沒時間看,忙完後又忘了之前正在看的某某源碼。個人建議

對於一般java程式設計師來說,閱讀源碼之前到底需要些什麼技能呢?

個人建議,以下基礎知識必須會一些:

會設計模式:包括單例模式、工廠模式、代理模式、裝飾器模式、責任鏈模式、模板方法模式等。

會猜測:大膽的猜測,在看源碼的時候,多站在高層次想想,如果你是Mybatis的設計者,你會怎麼設計?

會挑重點看:別被沒寫參數校驗、類型校驗等問題卡在那裡。

會畫圖:流程圖、類圖等,找一些在線畫圖工具,媒體畫完就保存下來,如果中途一段時間不看了,再回頭看看這些圖,也能快速繼續。

Mybatis源碼分析

今天,我們就來看看Mybatis源碼的閱讀,具體舉個例子來看看:

案例和疑問

從我們最初的demo中開始:

publicstaticvoidmain(String[] args) { String resource = "mybatis-config.xml"; InputStream inputStream = null; SqlSession sqlSession = null; try { inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); sqlSession = sqlSessionFactory.openSession(); User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectById", 1); System.out.println(user); } catch (Exception e) { e.printStackTrace(); } finally { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } sqlSession.close(); } }

關於獲取數據流inputStream,這個我們就不討論了,我們主要關注重點。

對於上面demo,我們可以分成五個步驟:

第一步,創建一個工廠類sqlSessionFactory。

配置文件的解析就是在這裡完成的。包括mybatis-config.xml和我們的Mapper.xml映射器文件。這一步我們關心的內容是:解析的時候做了什麼?產生了什麼對象,解析的結果放在哪裡的。因為這將意味著,我們後面使用的時候去哪裡獲取這項配置項內容。

第二步,通過SqlSessionFactory創建一個SqlSession。

那麼問題來了,SqlSession中定義了各種增刪改查的API,是給客戶端調用,返回的是什麼實現類?除了SqlSession以外,我們還創建了什麼對象,創建了什麼環境?

第三步,獲取到一個Mapper對象。

問題來了UserMapper.java是一個接口,並沒有為它創建實現類,那又是怎麼被實例化的呢?我們使用的這個Mapper對象到底是什麼對象呢?為什麼要從SqlSession裡去獲取呢?為什麼傳進去一個接口,然後還要用一個接口去接收呢?

第四步,調用接口方法。

問題是我們的接口沒有實現類,為什麼就可以直接調用它的方法呢?那它調用的是誰的方法呢?是如何把SQL給關聯起來的呢?是如何獲取到數據的呢?

第五步,關閉相關資源。

開始源碼分析過程

由於涉及到內容較多,下面就用幾張圖來展示整個流程。我們可以通過這幾張圖來快速翻閱Mybatis的源碼。

第一步

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

這一句代碼的整個流程如下:

根據inputStream,解析配置文件,創建出一個DefaultSqlSessionFactory默認的SqlSessionFactory 實現類。構建出一個工廠類,這個工廠類專門用來創建SqlSession對象的。

第二步

SqlSession sqlSession = sqlSessionFactory.openSession();

獲取SqlSession的整個流程如下:

第三步

User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectById", 1);

第三步和第四步就是這行代碼畫的。

這一步是返回一個映射器代理類,映射器代理類專門用來給UserMapper接口和UserMapper.xml綁定的代理類。創建出來的代理類就可以實例化了,然後就可以調用UserMapper接口的方了。

第四步:調用代理對象執行SQL的整個過程。

第五步,關閉資源。

希望大家按照這個流程,找點源碼看看。聽別人的看別人永遠是別人的。

動起來吧!

總結

其實,沒什麼好總結的。好好領悟一下為什麼糾結吧!同時希望能看看我的建議,作為一個過來人,希望能幫助大家少走彎路。

最後,對於Mybatis源碼閱讀的整個流程,最好是本地環境搭起來,然後搞個demo,debug模式一步一步走起。

相關焦點

  • mybatis中SqlSessionFactory類創建過程
    上一篇介紹了mybatis源碼環境的搭建,今天就來開始看源碼。mybatis執行主要流程上一篇文章中介紹的mybatis源碼環境中的測試代碼如下圖:可以看到可mybatis相關的實際上就只有三步:創建SqlSessionFactory、通過SqlSessionFactory創建SqlSession、SqlSession
  • Mybatis中mapper的xml解析詳解
    ,初始化XMLMapperBuilder方法的流程與加載mybatis的配置文件關鍵類XMLConfigBuilder及其相似,都是通過xml文件創建XPathParser對象作為XMLMapperBuilder對象的parse屬性。
  • MyBatis JPA Extra,MyBatis JPA 擴展 v2.2 發布
    相關資源MyBatis網站MyBatis GitHub源碼1、JavaBean注釋簡單只支持6個注釋 @Entity @Table @Column @Id @GeneratedValue @;import org.apache.mybatis.jpa.test.domain.Students;import org.apache.mybatis.jpa.util.WebContext;import
  • 從0 開始手寫一個 Mybatis 框架,三步搞定!
    本文完成的Mybatis功能比較簡單,代碼還有許多需要改進的地方,大家可以結合Mybatis源碼去動手完善。1Mybatis框架流程簡介在手寫自己的Mybatis框架之前,我們先來了解一下Mybatis,它的源碼中使用了大量的設計模式,閱讀源碼並觀察設計模式在其中的應用,才能夠更深入的理解源碼(ref:Mybatis源碼解讀-設計模式總結)。
  • 重學Java 設計模式:實戰代理模式「模擬mybatis-spring中定義DAO...
    四、案例場景模擬場景模擬;實現mybatis-spring中代理類生成部分「在本案例中我們模擬實現mybatis-spring中代理類生成部分」對於Mybatis的使用中只需要定義接口不需要寫實現類就可以完成增刪改查操作,有疑問的小夥伴,在本章節中就可以學習到這部分知識。
  • 「精品源碼分享」springboot開發的學校教務管理系統
    前言大家好,我是it分享師,今天給大家帶來一個基於Springboot開發的精緻的學校教務管理系統的源碼!如果覺得本文對您有用的話,點讚,轉發,關注三連,私信我獲取源碼!創作不易,謝謝支持!使用技術該系統使用了springboot+mybatis+layui+shiro+jquery等技術開發而成有3個基本角色,為管理員,老師和學生!管理員具有這些模塊的所有功能!老師具有課程管理,成績管理,學生管理等功能!學生有選課管理等功能!基本實現了學校學生選課的一個後臺管理系統!
  • Mybatis中SqlSource解析流程詳解
    前面幾篇文章都在詳細分析mapper的加載過程,但是始終沒有看到sql的解析過程,今天來詳細分析下。SqlSource對象都是通過LanguageDriver實現的,翻譯過來叫做語言驅動,它是一個接口,通過上面源碼可以看出來我們可以自己實現這個接口,並且可以指定使用哪個語言驅動。
  • 心情煩躁怎麼辦 心情煩躁有這幾種原因
    煩躁的心情人人都會有,有些是因為工作上的事使人煩躁,有些是因為朋友上的事等等。如果我們大家心情煩躁了會怎麼做呢?會以什麼樣的方式來緩解煩躁的心情呢?煩躁的具體原因有哪些呢?這些問題小編已經為大家做了解答嘍,請看下文吧。心情煩躁怎麼辦1、目標轉移法如果你是因為某件事或者是某個人而感到心情煩躁,注意力無法集中,就不要強迫自己了。
  • 焦慮煩躁怎麼辦?不如試試這些辦法
    焦慮煩躁怎麼辦?小麗來教你幾招~01 呼吸練習如果你感到焦慮,一個讓你自己冷靜的簡單的方法就是通過把注意力放在你呼吸的規律上。當我們感到緊張的時候,我們吸氣比呼氣長。所以為了讓自己冷靜下來,我們可以調整呼吸節奏,讓呼氣比吸氣長。
  • 乾貨|新手也能看懂的源碼閱讀技巧
    回想起來覺得那時候的想法確實挺……工作了一年多之後準備跳槽了,開始了一輪的面試,其中有幾個面試官就問到了相關的源碼問題:ArrayList、HashMap的底層實現,spring、mybatis的相關源碼。問源碼的面試一般就是回去等消息,然後就沒然後了。
  • 小學妹問:Mybatis常見註解有哪些?
    org.mybatis.spring.annotation.MapperScan使用方式@SpringBootApplication@MapperScan("com.tian.mybatis.mapper")public class Application {}
  • 徹底搞懂MyBatis插件原理及PageHelper原理
    完成以上兩步,我們就完成了一個插件的配置了,接下來我們運行一下:可以看到,setProperties方法在加載配置文件階段就會被執行了。MyBatis插件實現原理接下來讓我們分析一下從插件的加載到初始化到運行整個過程的實現原理。
  • 【科普】夏季心情煩躁怎麼辦?
    夏天氣溫高,天氣熱,人的心情也隨著煩躁起來了,那麼夏天心情煩躁的原因有哪些呢?夏天心情煩躁應該怎麼辦呢?針對這些問題我們來詳細介紹下!夏天隨著氣溫升高,人們的心情也變得煩躁。據調查夏季溫度高人體大量排汗,而隨著汗液可以排除大量的鉀,鉀元素的作用是維持神經和肌肉的正常功能。
  • mybatis源碼分析:從SqlSessionFactory到代理對象的生成
    緊接著,就到了一步比較重要的部分,當然只是我個人覺得,因為第一遍看的時候,我沒有想到,這步居然可以封裝許許多多的重要信息,我們來看一看:映射配置文件的讀取依靠namespace,我們可以通過查看源碼發現讀取映射配置文件的方法是loadXmlResouce(),所以namespace命名空間至關重要:
  • 疫情期間宅太久,焦慮、煩躁怎麼辦?教你如何緩解
    儘管宅家的生活對於一些「宅男宅女」而言沒有造成很大影響,但是大部分人都由於長期沒有出門,進而出現了一定的不良反應以及負面情緒,比如做事缺少樂趣、抑鬱、焦慮、煩躁等。那麼,為什麼長期宅在家裡會導致不良情緒產生呢?疫情期間宅家,為什麼會感覺焦慮、煩躁?
  • 面試官:Mybatis 使用了哪些設計模式?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫雖然我們都知道有20多個設計模式,但是大多停留在概念層面,真實開發中很少遇到,Mybatis源碼中使用了大量的設計模式,閱讀源碼並觀察設計模式在其中的應用,能夠更深入的理解設計模式。
  • SpringBoot + MyBatis + MySQL讀寫分離實踐!
    <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot
  • Spring源碼解析之源碼的下載編譯
    老粉應該知道了,筆者最近剛上架技術生涯的第一本書《Java源碼模擬面試解析指南 》。於是趁著年輕時還有時間修福報,準備再做一個 Spring源碼面試指南。相比於之前是直接閱讀引入jar包的方式來研讀 JDK 源碼,由於框架源碼的複雜性及強可插拔性,一般將源碼編譯到本地,由此便可以邊研讀源碼邊加自由地注釋,方便調試程序等。首先進入 spring 官方倉庫,fork 一份倉庫到自己帳號下,方便自己提交。
  • 「奧斯塔羅」上班好累、心情煩躁 最近感到無力的原因是?
    這樣的牌組代表家庭層面的問題,或許是家庭或好朋友最近有些狀況,讓你感到些許無力,不過,有時人的關心會讓你感到些許的煩躁,殊不知只要你冷靜下來就可以了,話雖如此,奧斯還是要提醒你,有時周遭朋友的過問,是來關心你的,千萬別因為一時的情緒,而拒絕了他人的關心哦!牌lll選到這組牌的朋友,是否有生活上的瑣事,讓你感到煩躁與不安?
  • 莫名的「煩躁」怎麼辦?
    我們都有這種經歷,早晨起來或者突然之間內心就莫名的煩躁起來。因為什麼原因煩躁?也許你自己都不知道,不然怎麼叫做莫名的煩躁呢?內心煩躁會使你脾氣變差,做事的心態會變差。即使當時你什麼都不做,接下來依然會有各種各樣的壞事接踵而來。