1. 程式人生 > >JDBC Class.forName("com.mysql.jdbc.Driver")的作用

JDBC Class.forName("com.mysql.jdbc.Driver")的作用

使用JDBC時,我們都會很自然得使用下列語句: java 程式碼
  1. Class.forName("com.mysql.jdbc.Driver");
  2. String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
  3. String user = "";
  4. String psw = "";
  5. Connection con = DriverManager.getConnection(url,user,psw);


為什麼說很自然呢,因為無論是網上還是書本教程上得例子都是這樣的,而且程式也確實正常運行了,於是大家也就心安理得的找葫蘆畫瓢下去了。
一定要有這一句嗎?不是的,我們完全可以用這樣一句代替它:

java 程式碼
  1. com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
  2. //or:
  3. //new com.mysql.jdbc.Driver();
  4. String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
  5. String user = "";
  6. String psw = "";
  7. Connection con = DriverManager.getConnection(url,user,psw);

大家可能都看出個大概來了,我們只需要在呼叫DriverManager的getConnection方法之前,保證相應的Driver類已經被載入到jvm中,並且完成了類的初始化工作就行了,而具體是怎樣實現這個功能卻是沒有講究的。上面兩種方法都可以實現這個功能,因此程式可以正常執行。注意了,如果我們進行如下操作,程式是不能正常執行的,因為這樣僅僅使Driver類被裝載到jvm中,卻沒有進行相應的初始化工作。

java 程式碼
  1. com.mysql.jdbc.Driver driver = null;
  2. //or:
  3. ClassLoader cl = new ClassLoader();
  4. cl.loadClass("com.mysql.jdbc.Driver");


我們都知道JDBC是使用Bridge模式進行設計的,DriverManager就是其中的Abstraction,java.sql.Driver是Implementor,com.mysql.jdbc.Driver是Implementor的一個具體實現(請參考GOF的Bridge模式的描述)。大家注意了,前一個Driver是一個介面,後者卻是一個類,它實現了前面的Driver介面。
Bridge模式中,Abstraction(DriverManager)是要擁有一個Implementor(Driver)的引用的,但是我們在使用過程中,並沒有將Driver物件註冊到DriverManager中去啊,這是怎麼回事呢?jdk文件對Driver的描述中有這麼一句:
When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager

哦,原來是com.mysql.jdbc.Driver在裝載完後自動幫我們完成了這一步驟。原始碼是這樣的:

java 程式碼
  1. package com.mysql.jdbc
  2. publicclass Driver extends NonRegisteringDriver implements java.sql.Driver {
  3. // ~ Static fields/initializers
  4. // --------------------------------------------- //
  5. // Register ourselves with the DriverManager
  6. //
  7. static {
  8. t ry {
  9. java.sql.DriverManager.registerDriver(new Driver());
  10. } catch (SQLException E) {
  11. thrownew RuntimeException("Can't register driver!");
  12. }
  13. }
  14. // ~ Constructors
  15. // -----------------------------------------------------------
  16. /**
  17. * Construct a new driver and register it with DriverManager
  18. *
  19. * @throws SQLException
  20. * if a database error occurs.
  21. */
  22. public Driver() throws SQLException {
  23. // Required for Class.forName().newInstance()
  24. }
  25. }

相關推薦

JDBC Class.forName("com.mysql.jdbc.Driver")的作用

使用JDBC時,我們都會很自然得使用下列語句: java 程式碼 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&c

關於Class.forName(“com.mysql.jdbc.Driver”)

can new class load uid services text strac tco 傳統的使用jdbc來訪問數據庫的流程為:Class.forName(“com.mysql.jdbc.Driver”);String url = “jdbc:mysql://loca

Class.forName("com.mysql.jdbc.Driver") 是個什麼鬼?

一句話總結這行程式碼的功能:將mysql驅動註冊到DriverManager中去。 那麼為什麼可以通過這行程式碼實現註冊driver功能呢? 答: 通過呼叫這個方法,就可以將mysql的驅動driver類的class檔案載入到記憶體中; 又由於載入類檔案會執行其

為什麼需要Class.forName("com.mysql.jdbc.Driver")

在使用傳統的JDBC連線資料庫的時候,總是需要這一句(以MySQL為例): Class.forName("com.mysql.jdbc.Driver");   以前我也沒深究,只是看網上的例子都這麼寫,實際上也跑通了,於是便懶得去管內部原理。不過大概還是清楚的,知道這句話是

Class.forName("com.mysql.jdbc.Driver");異常解決

如果您在執行java程式碼的時候出現此問題。 您是忘記匯入mysql-connector-java-5.1.18.jar這個包了。 將它放在  如果你是在執行伺服器的時候出錯。 可見,他並沒有用到 mysql-connector-java-5.1.18.jar

org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver'

背景: 把連線池操控資料庫的java程式做成jar包導致如下錯誤 報錯如下: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver'  &

Loading class 'com.mysql.jdbc.Driver', This is deprecated. The new driver class is'com.cj.jdbc.Driv'

使用的資料庫是MySQL,驅動是6.0.6,這是由於資料庫和系統時區差異所造成的,在jdbc連線的url後面加上serverTimezone=GMT即可解決問題,如果需要使用gmt+8時區,需要寫成GMT%2B8,否則會被解析為空。再一個解決辦法就是使用低版本的MySQL jdbc驅動,5

yml中driver-class-name: com.mysql.jdbc.Driver 解析不到的問題

當在idea中使用springboot的快捷建立方式時,選中了mysql 和jdbc 那麼pom檔案中會直接有 <dependency> <groupId>mysql</groupId> <artifactId

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'.

技術 loading 使用 -c drive sql mysql- 連接 不可 在連接數據庫時,使用了最新版本的mysql-Connector,所以導致老版本的“com.mysql.jdbc.Drive”不可行,要改為“com.mysql.cj.jdbc.Driver”

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is`...

springboot專案,用了最新的mysql連線驅動,報錯如下: Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'.

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj....

今天使用 mysql-8.0.13版本資料庫連結時出現了以下問題 Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The

Java連線MySQL資料庫8.0以上版本遇到的坑(The new driver class is `com.mysql.cj.jdbc.Driver

我遇到了java無法連線mysql資料庫8.0.1的問題。         報錯:Loading class `com.mysql.jdbc.Driver'. This is deprecated.

Cannot load driver class: com.mysql.jdbc.Driver錯誤記錄

報錯如下 (Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj....

今天使用 mysql-8.0.13版本資料庫連結時出現了以下問題 Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Dr

SpringBoot——Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.

報錯的資訊為: 這是因為更換了最新的MySQL驅動 之前的是: jdbc.driverClass = com.mysql.dbc.Driver jdbc.url = jdbc:mysql://127.0.0.1:3306/db?useUnicode=true&am

Sqoop: java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver

錯誤一、 Got exception running Sqoop: java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver 解決方法:  1、將mysql的驅動包拷貝到

springboot專案報Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is`...解

參考文章:https://blog.csdn.net/qq_42815754/article/details/83652253 <!-- MySql驅動 --> <dependency> <groupId>mysql</groupId>

解決辦法 : Loading class `com.mysql.jdbc.Driver'. This is deprecated...

Loading class com.mysql.jdbc.Driver’. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver’. The driver is automatically registered

Spring Boot 出現Cannot load driver class: com.mysql.jdbc.Driver

最近將一個原先的一個小demo改為Spring Boot框架,準備執行一下專案的,但出現問題Cannot load driver class: com.mysql.jdbc.Driver 現對該問題做

Cannot load JDBC driver class 'com.mysql.jdbc.Driver '

       整合spring+springmvc+mybatis的時候一直出現這個錯誤,後來經過除錯才知道,是我在config.properties檔案中多了空格在密碼以及driver=com.m