成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

運(yùn)維 數(shù)據(jù)庫(kù)運(yùn)維
因?yàn)槊嬖嚨臅r(shí)候,面試官很喜歡問(wèn):你看過(guò)什么框架源碼?JDK源碼也行。這時(shí)候,如果回答沒(méi)有看過(guò),雖然沒(méi)讓你立馬回去等通知。但也許,你在面試官心中的印象就大打折扣了。

 [[357382]]

背景

最近,聽(tīng)到很多吐槽:看到源碼,心中就感到十分糾結(jié)、特別煩惱。

為什么糾結(jié)?

因?yàn)槊嬖嚨臅r(shí)候,面試官很喜歡問(wèn):你看過(guò)什么框架源碼?JDK源碼也行。

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

如果回答看過(guò),并且還能較為流利地說(shuō)上一番,那面試官或許會(huì)在心里贊嘆:小伙子可以呀!(PS:很多面試官自己也沒(méi)看過(guò),或者看過(guò)很多也忘了)。

總之,你要是能說(shuō)上個(gè)123,那給面試官的印象就會(huì)杠杠滴好。何愁工作?何愁加薪?

為什么煩?

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

缺乏技術(shù)支撐。看源碼是需要技術(shù)支撐的,不是隨便一個(gè)小白也能看懂的。沒(méi)有一些技術(shù)支撐,你頂多看看一小段,然后就看不下去,于是就放棄了。

缺乏正確心態(tài)。看源碼確實(shí)挺無(wú)聊的,如果大家心態(tài)沒(méi)放好,把它當(dāng)做一種任務(wù)去做,肯定覺(jué)得無(wú)聊,而且很容易放棄。

缺乏足夠時(shí)間。確實(shí)很忙,經(jīng)常看了一部分后,天天加班,沒(méi)時(shí)間看,忙完后又忘了之前正在看的某某源碼。

個(gè)人建議

對(duì)于一般java程序員來(lái)說(shuō),閱讀源碼之前到底需要些什么技能呢?

個(gè)人建議,以下基礎(chǔ)知識(shí)必須會(huì)一些:

會(huì)設(shè)計(jì)模式:包括單例模式、工廠模式、代理模式、裝飾器模式、責(zé)任鏈模式、模板方法模式等。

會(huì)猜測(cè):大膽的猜測(cè),在看源碼的時(shí)候,多站在高層次想想,如果你是Mybatis的設(shè)計(jì)者,你會(huì)怎么設(shè)計(jì)?

會(huì)挑重點(diǎn)看:別被沒(méi)寫(xiě)參數(shù)校驗(yàn)、類型校驗(yàn)等問(wèn)題卡在那里。

會(huì)畫(huà)圖:流程圖、類圖等,找一些在線畫(huà)圖工具,媒體畫(huà)完就保存下來(lái),如果中途一段時(shí)間不看了,再回頭看看這些圖,也能快速繼續(xù)。

Mybatis源碼分析

今天,我們就來(lái)看看Mybatis源碼的閱讀,具體舉個(gè)例子來(lái)看看:

案例和疑問(wèn)

從我們最初的demo中開(kāi)始:

  1. public static void main(String[] args) { 
  2.         String resource = "mybatis-config.xml"
  3.         InputStream inputStream = null
  4.         SqlSession sqlSession = null
  5.         try { 
  6.             inputStream = Resources.getResourceAsStream(resource); 
  7.             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
  8.             sqlSession = sqlSessionFactory.openSession();  
  9.             User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectById", 1); 
  10.             System.out.println(user);  
  11.         } catch (Exception e) { 
  12.             e.printStackTrace(); 
  13.         } finally { 
  14.             try { 
  15.                 inputStream.close(); 
  16.             } catch (IOException e) { 
  17.                 e.printStackTrace(); 
  18.             } 
  19.             sqlSession.close(); 
  20.         } 
  21.     } 

關(guān)于獲取數(shù)據(jù)流inputStream,這個(gè)我們就不討論了,我們主要關(guān)注重點(diǎn)。

對(duì)于上面demo,我們可以分成五個(gè)步驟:

第一步,創(chuàng)建一個(gè)工廠類sqlSessionFactory。

配置文件的解析就是在這里完成的。包括mybatis-config.xml和我們的Mapper.xml映射器文件。這一步我們關(guān)心的內(nèi)容是:解析的時(shí)候做了什么?產(chǎn)生了什么對(duì)象,解析的結(jié)果放在哪里的。因?yàn)檫@將意味著,我們后面使用的時(shí)候去哪里獲取這項(xiàng)配置項(xiàng)內(nèi)容。

第二步,通過(guò)SqlSessionFactory創(chuàng)建一個(gè)SqlSession。

那么問(wèn)題來(lái)了,SqlSession中定義了各種增刪改查的API,是給客戶端調(diào)用,返回的是什么實(shí)現(xiàn)類?除了SqlSession以外,我們還創(chuàng)建了什么對(duì)象,創(chuàng)建了什么環(huán)境?

第三步,獲取到一個(gè)Mapper對(duì)象。

問(wèn)題來(lái)了UserMapper.java是一個(gè)接口,并沒(méi)有為它創(chuàng)建實(shí)現(xiàn)類,那又是怎么被實(shí)例化的呢?我們使用的這個(gè)Mapper對(duì)象到底是什么對(duì)象呢?為什么要從SqlSession里去獲取呢?為什么傳進(jìn)去一個(gè)接口,然后還要用一個(gè)接口去接收呢?

第四步,調(diào)用接口方法。

問(wèn)題是我們的接口沒(méi)有實(shí)現(xiàn)類,為什么就可以直接調(diào)用它的方法呢?那它調(diào)用的是誰(shuí)的方法呢?是如何把SQL給關(guān)聯(lián)起來(lái)的呢?是如何獲取到數(shù)據(jù)的呢?

第五步,關(guān)閉相關(guān)資源。

開(kāi)始源碼分析過(guò)程

由于涉及到內(nèi)容較多,下面就用幾張圖來(lái)展示整個(gè)流程。我們可以通過(guò)這幾張圖來(lái)快速翻閱Mybatis的源碼。

第一步

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

這一句代碼的整個(gè)流程如下:

根據(jù)inputStream,解析配置文件,創(chuàng)建出一個(gè)DefaultSqlSessionFactory默認(rèn)的SqlSessionFactory 實(shí)現(xiàn)類。構(gòu)建出一個(gè)工廠類,這個(gè)工廠類專門(mén)用來(lái)創(chuàng)建SqlSession對(duì)象的。

第二步

  1. SqlSession  sqlSession = sqlSessionFactory.openSession(); 

獲取SqlSession的整個(gè)流程如下:

第三步

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

第三步和第四步就是這行代碼畫(huà)的。

這一步是返回一個(gè)映射器代理類,映射器代理類專門(mén)用來(lái)給UserMapper接口和UserMapper.xml綁定的代理類。創(chuàng)建出來(lái)的代理類就可以實(shí)例化了,然后就可以調(diào)用UserMapper接口的方了。

第四步:調(diào)用代理對(duì)象執(zhí)行SQL的整個(gè)過(guò)程。

第五步,關(guān)閉資源。

希望大家按照這個(gè)流程,找點(diǎn)源碼看看。聽(tīng)別人的看別人永遠(yuǎn)是別人的。

動(dòng)起來(lái)吧!

總結(jié)

其實(shí),沒(méi)什么好總結(jié)的。好好領(lǐng)悟一下為什么糾結(jié)吧!同時(shí)希望能看看我的建議,作為一個(gè)過(guò)來(lái)人,希望能幫助大家少走彎路。

最后,對(duì)于Mybatis源碼閱讀的整個(gè)流程,最好是本地環(huán)境搭起來(lái),然后搞個(gè)demo,debug模式一步一步走起。

本文轉(zhuǎn)載自微信公眾號(hào)「 Java后端技術(shù)全棧」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系 Java后端技術(shù)全棧公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: Java后端技術(shù)全棧
相關(guān)推薦

2024-07-15 09:08:51

源碼debug根節(jié)點(diǎn)

2022-05-17 10:41:20

接口JSON數(shù)據(jù)

2019-10-12 09:50:46

Redis內(nèi)存數(shù)據(jù)庫(kù)

2018-01-28 20:39:39

戴爾

2022-07-05 11:48:47

MySQL死鎖表鎖

2009-11-03 08:56:02

linux死機(jī)操作系統(tǒng)

2024-04-22 08:17:23

MySQL誤刪數(shù)據(jù)

2022-12-19 11:31:57

緩存失效數(shù)據(jù)庫(kù)

2017-02-21 13:11:43

SDN網(wǎng)絡(luò)體系SDN架構(gòu)

2022-05-19 08:01:49

PostgreSQL數(shù)據(jù)庫(kù)

2015-10-22 09:09:59

BAT投資VC

2020-12-30 08:35:59

Linux運(yùn)維Linux系統(tǒng)

2015-10-10 08:52:13

程序員疲勞

2024-10-18 09:55:50

RedisHash數(shù)據(jù)

2022-07-05 14:19:30

Spring接口CGLIB

2011-11-16 10:02:48

DNSDNS記錄DNS記錄消失

2011-11-18 10:52:00

2022-10-14 08:18:07

Guavaweb應(yīng)用

2010-04-20 08:56:53

2017-12-21 20:01:38

潤(rùn)乾報(bào)表
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91精品国产91久久久久游泳池 | 日韩精品在线免费观看 | 国产最好的av国产大片 | 蜜桃精品视频在线 | 91在线视频免费观看 | 国产真实精品久久二三区 | 日韩在线看片 | 在线播放国产一区二区三区 | 久久av一区二区三区 | 亚洲欧美激情精品一区二区 | 超碰在线影院 | 一区二区视频免费观看 | 精品视频一区在线 | 久久久精品一区 | 国产性网 | 综合国产在线 | 黄色大片免费观看 | 久久亚洲国产精品日日av夜夜 | 亚洲女人的天堂 | 黄色大片在线视频 | 欧美日韩精品久久久免费观看 | 国产黄色一级片 | 2021狠狠干| 久草.com | 91资源在线 | 久草免费在线视频 | 国产精品久久久久无码av | 久久久噜噜噜久久中文字幕色伊伊 | 欧美日韩一区二区电影 | 爱爱免费视频 | 夜夜夜夜夜夜曰天天天 | 琪琪午夜伦伦电影福利片 | 91色视频在线观看 | 午夜一区二区三区在线观看 | 人人九九精| 91动漫在线观看 | 国产成在线观看免费视频 | 日韩日b视频 | 91视频导航| 免费能直接在线观看黄的视频 | 午夜电影福利 |