MySQL-connector加載過程

之前在看goorm連接數(shù)據(jù)庫(kù)的時(shí)候看到一段代碼

import _ "github.com/go-sql-driver/mysql"

引入mysql驅(qū)動(dòng)后把返回值丟棄掉了。原來(lái)一直不明白為什么,丟掉了驅(qū)動(dòng)對(duì)象那么我們操作數(shù)據(jù)庫(kù)是通過什么來(lái)進(jìn)行的呢?
在Java中也是一樣的,如果我們不用框架,手動(dòng)連接數(shù)據(jù)庫(kù)的話,是使用這樣的代碼

Class.forName("com.mysql.cj.jdbc.Driver")
Connection conn = DriverManager.getConnection("url")

這里也是一樣,我們把類加載完以后并沒有使用,甚至都沒有創(chuàng)建它的對(duì)象。而是直接使用DriverManager去獲取連接了。我們加載這個(gè)類的意義在哪呢?如果不用它的對(duì)象的話我們直接用DriverManager去連接不就好了嗎?
帶著這樣的疑問我看mysql-connector-java的源碼才明白。原來(lái)在com.mysql.cj.jdbc.Driver這個(gè)類中有一個(gè)靜態(tài)的代碼塊

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

我們都知到加載一個(gè)類的時(shí)候靜態(tài)代碼塊會(huì)自動(dòng)執(zhí)行(這里說法不嚴(yán)謹(jǐn),ClassLoader.loadClass()就不會(huì)執(zhí)行,這里不討論這個(gè)問題),而靜態(tài)代碼里面執(zhí)行的邏輯就是往DriverManager里面注冊(cè)一個(gè)Driver,所以我們接下來(lái)使用DriverManager獲取連接就能獲取到了??梢韵胂?,如果我們不執(zhí)行靜態(tài)代碼,沒有注冊(cè)驅(qū)動(dòng)的話,直接獲取連接肯定就獲取不到了。

根據(jù)對(duì)這件事情的思考我也明白了這樣一個(gè)道理:

我們常說Java是一個(gè)面向?qū)ο蟮木幊陶Z(yǔ)言,所以我們習(xí)慣性的做什么事情都要先找到對(duì)象,有了對(duì)象才能執(zhí)行邏輯??墒敲嫦?qū)ο笠彩怯擅嫦蜻^程演化來(lái)的,Java底層肯定有很多沒有使用對(duì)象處理的事情,所以說不要被思維慣性束縛了自己,面向?qū)ο笠埠?,面向過程也好,只要能解決問題就是好的程序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 開發(fā)中連接數(shù)據(jù)庫(kù)的方式有多中,可以直接用jdbc連接,也可以配置服務(wù)器的連接池.寫法也有多種,可以直接寫在jsp頁(yè)...
    傳奇內(nèi)服號(hào)閱讀 950評(píng)論 0 0
  • ?在《Java類加載器:類加載原理解析》提到的類加載器的雙親委派模型并不是一個(gè)強(qiáng)制性的約束模型,而是Java設(shè)計(jì)者...
    SunnyMore閱讀 2,699評(píng)論 2 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,679評(píng)論 18 399
  • 如果有一天我醒來(lái)時(shí),發(fā)現(xiàn)自己的幾年Java開發(fā)經(jīng)驗(yàn)被抹掉,重新回到了一個(gè)小白的狀態(tài)。我想要重新自學(xué)Java,然后找...
    feel_58e7閱讀 722評(píng)論 0 1
  • 一、簡(jiǎn)歷準(zhǔn)備 1、個(gè)人技能 (1)自定義控件、UI設(shè)計(jì)、常用動(dòng)畫特效 自定義控件 ①為什么要自定義控件? Andr...
    lucas777閱讀 5,387評(píng)論 2 54

友情鏈接更多精彩內(nèi)容