知識小罐頭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陣列和類的組合嘛!再加一些擴容等條件的判斷以及一些演算法,最後就叫做容器;