1. 程式人生 > >知識小罐頭02

知識小罐頭02

  萌新科普文

  這次來簡單說說mysql驅動,不要用了這麼久的框架,突然被人問起什麼叫做mysql驅動、內部怎麼工作的啊,你卻突然的不知道了,那就尷尬了。

  注:最好用jdk1.6(這個看DriverManager原始碼一目瞭然),mysql驅動嘛,不要用太高版本了,版本越高封裝的越徹底,不利於萌新看底層原理。

  然而我並沒有裝1.6,於是我就到處找了一些材料加上我自己找的一些程式碼湊數啊!(繼續偷懶。。。。)

  大家是不是對於mysql,oracle,SQL Server,DB2等資料庫的其中一種或者幾種用法很是熟悉了,很多的框架都會用到。

  以mysql為例,在java中連線資料庫,最開始是用jdbc,想必大家對下面這幾句程式碼很是熟悉了。

  首先是載入mysql驅動,然後是獲取連線,很初級的程式碼。

  我最開始學jdbc的時候,我就納悶了!為什麼要載入驅動,驅動又是什麼鬼啊?反正就只知道要想連線資料庫就要下載個驅動。

  那個DriverManager是哪裡來的啊?還有,這樣就獲取連線了,為什麼這個方法就能獲取連線啊?

  這種問題最是讓初學者困惑不已(我就是這樣的,嘿嘿)。

  其實吧,用大白話說一下,就是java裡面提供了一個介面(java.sql.Driver)用於和任意的資料庫連線,而mysql資料庫開發商此時看到java這麼火就要默默的寫個實現類(就是所謂的資料庫驅動),去實現這個介面,不然java語言用不了你這個資料庫(那資料庫的推廣就會受到限制,賺的錢就少了嘛!)。

  而java中還會有一個類DriverManager,顧名思義,就是來管理別人傳過來的Driver類(裡面肯定有個屬性是一個容器,通過類似set作用的方法把Driver的例項存起來,供其他的方法使用),這就是口述版mysql驅動的原理。

  下面來看看原始碼,分析分析。

  開啟上圖的第一個標記

 

  現在開啟registerDriver方法,看看是怎麼包裝Driver例項的(jdk1.6)。

  也可以看看jdk1.8的

 

  我們來看看DriverInfo裡面有哪些屬性

 

  (jdk1.6)是不是發現還有一個initialize方法啊,其實這個方法簡單說一下,就是遍歷所有的資料庫驅動(實現了java.sql.Driver的實現類),並用系統類載入器去載入。還有,在,圖上還有一個writeDrivers(就是負責註冊驅動)和readDrivers(註冊成功的驅動複製到這裡,後面要我們要用就直接來這裡取);

  因為其中涉及的東西太細了,就粗略說一下,感興趣的小夥伴可以自己進去仔細研究啊!

  jdk1.8就不去看了,裡面變化了很多演算法什麼的,但是大概的邏輯還是這樣的。

  接下來,看看怎麼通過DriverManager的靜態方法去獲得connection(這裡我把很多判斷性的程式碼刪除了,留下一些基本邏輯)。

 

 
 

  

  到達這裡,就差不多了,本質就是去實現類裡面看實現類的connect方法,是怎麼通過傳遞過去的過去的url、使用者名稱、密碼,最後返回給我們connection物件。

 

 

  開啟這個父類,看connect方法裡面大概的做法

 

  emmmm....後面的太多了,要分析太涉及底層了,我把大概的邏輯說一下吧!就是通過socket(內部封裝了io流)去連結mysql 服務端(進行三次握手),並進行使用者名稱和密碼的校驗,以及一些資料加密的工作等等, 想仔細瞭解的小夥伴可以自己翻看原始碼。

  其實,還有很多的東西,比如後面的預編譯啊什麼原理啊,還沒說呢,咳咳,畢竟是一個給萌新科普的隨筆,就不說多了,哈哈,偷個懶!

  到這裡,萌新們是不是對mysql驅動了解了一點啦!

  繼續說廢話(嘿嘿~):學東西要學本質才能印象深刻啊,不然睡一覺之後就忘了!比如學mysql驅動,本質就是io流+socket+類+一些基本邏輯的處理;就比如學javase的容器(list,set.,map),本質就是Object陣列和類的組合嘛!再加一些擴容等條件的判斷以及一些演算法,最後就叫做容器;