亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java中連接mysql時添加Class.forName("com.mysql.jdbc

java中連接mysql時添加Class.forName("com.mysql.jdbc

元芳怎么了 2019-03-04 12:15:30
java連接mysql數據庫時總是報錯:try {       connection = DriverManager.getConnection(url, username, password);} catch (Exception e) {       e.printStackTrace();}錯誤信息是:java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306但加上Class.forName("com.mysql.jdbc.Driver")后就能正常運行:try {       Class.forName("com.mysql.jdbc.Driver");       connection = DriverManager.getConnection(url, username, password);} catch (Exception e) {       e.printStackTrace();}Class.forName("com.mysql.jdbc.Driver")的作用是什么?
查看完整描述

4 回答

?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

這個問題翻一下兩個類的源碼就可以很清楚的了解了。

不過首先你的明白Class.forName()的作用,這個是用來加載指定類的。

為什么需要手動去加載呢?正常情況下對于一個Java程序來說我們不需要去管某個類的加載,只需要在用來的時候import進去即可,但是對于JDBC的設計是不一樣的,你可以從你的數據庫連接代碼中發現,DriverManage在決定使用哪個驅動的時候并不是由開發者指定的,而是通過遍歷所有已注冊的驅動來嘗試獲取連接,成功就返回,失敗就next,所以代碼中并沒有顯示的指定驅動,這一點可以從DriverManage的源碼中可以看到。


for(DriverInfo aDriver : registeredDrivers) {

    // If the caller does not have permission to load the driver then

    // skip it.

    if(isDriverAllowed(aDriver.driver, callerCL)) {

        try {

            println("    trying " + aDriver.driver.getClass().getName());

            Connection con = aDriver.driver.connect(url, info);

            if (con != null) {

                // Success!

                println("getConnection returning " + aDriver.driver.getClass().getName());

                return (con);

            }

        } catch (SQLException ex) {

            if (reason == null) {

                reason = ex;

            }

        }

    } else {

        println("    skipping: " + aDriver.getClass().getName());

    }

}

這個類基本可以明白JDBC是如何獲取連接的,問題是registeredDrivers是怎么來的,從DriverManager的源碼中只能夠發現一個registerDriver方法可以往registeredDrivers中注冊驅動,所以自然是由驅動類自行將自己注冊到registeredDrivers中,這一點可以通過查看com.mysql.jdbc.Driver類源碼得到證實。


    //

    // Register ourselves with the DriverManager

    //

    static {

        try {

            java.sql.DriverManager.registerDriver(new Driver());

        } catch (SQLException E) {

            throw new RuntimeException("Can't register driver!");

        }

    }

這個是jdbc.Driver的一段static代碼,這段代碼在類加載時會自動執行,所以就把自己注冊到DriverManage的registerDriver中了,這樣整個流程就全部通了。


綜上,不懂得問題翻翻代碼就清楚了,多動手。


查看完整回答
反對 回復 2019-04-16
?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

加載驅動用的。forName方法的參數是一個類的包名加類名,這個類在MySQL驅動的jar包里可以找到


查看完整回答
反對 回復 2019-04-16
?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

class.forName("com.mysql.jdbc.Driver")會在classpath中查找并加載這個類。一旦com.mysql.jdbc.Driver被加載并連接后,就自動執行static靜態代碼塊,這時就可以做一些初始化的工作了,最主要的作用就是執行java.sql.DriverManager.registerDriver()來注冊驅動。如果沒有class.forName這一步,就會報找不到合適的驅動程序。

查看完整回答
反對 回復 2019-04-16
?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

通過反射機制加載數據庫驅動類。
不然誰知道你鏈接的是哪個數據庫啊。。。

查看完整回答
反對 回復 2019-04-16
  • 4 回答
  • 0 關注
  • 779 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號