之前在看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ū)ο笠埠?,面向過程也好,只要能解決問題就是好的程序。