1. 程式人生 > >JDBC驅動載入原理全面解析

JDBC驅動載入原理全面解析

本文轉載自http://blog.csdn.net/luanlouis/article/details/29850811,感謝分享

前言

         最近在研究Mybatis框架,由於該框架基於JDBC,想要很好地理解和學習Mybatis,必須要對JDBC有較深入的瞭解。所以便把JDBC 這個東東翻出來,好好總結一番,作為自己的筆記,也是給讀者一個參考~~~以下是本文的組織結構,讀者可以點選上面的目錄檢視:


概述      

      一般情況下,在應用程式中進行資料庫連線,呼叫JDBC介面,首先要將特定廠商的JDBC驅動實現載入到系統記憶體中,然後供系統使用。基本結構圖如下:

    

驅動載入入記憶體的過程

    這裡所謂的驅動,其實就是實現了java.sql.Driver介面的類。如oracle的驅動類是 oracle.jdbc.driver.OracleDriver.class(此類可以在oracle提供的JDBC jar包中找到),此類實現了java.sql.Driver介面。

由於驅動本質上還是一個class,將驅動載入到記憶體和載入普通的class原理是一樣的:使用Class.forName("driverName")。以下是將常用的資料庫驅動載入到記憶體中的程式碼:

[java]
 view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. //載入Oracle資料庫驅動
  2. Class.forName("oracle.jdbc.driver.OracleDriver");  
  3. //載入SQL Server資料庫驅動
  4. Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");  
  5. //載入MySQL 資料庫驅動
  6. Class.forName("com.mysql.jdbc.Driver");  

         注意:Class.forName()將對應的驅動類載入到記憶體中,然後執行記憶體中的static靜態程式碼段,程式碼段中,會建立一個驅動Driver的例項,放入DriverManager中,供DriverManager使用。

      例如,在使用Class.forName() 載入oracle的驅動oracle.jdbc.driver.OracleDriver時,會執行OracleDriver中的靜態程式碼段,建立一個OracleDriver例項,然後呼叫DriverManager.registerDriver()註冊:

[java] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. static {  
  2.     Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");  
  3.     try {  
  4.         if (defaultDriver == null) {  
  5.             //建立一個OracleDriver例項,然後註冊到DriverManager中
  6.                                defaultDriver = new OracleDriver();  
  7.             DriverManager.registerDriver(defaultDriver);  
  8.         }  
  9.     } catch (RuntimeException localRuntimeException) {  
  10.     } catch (SQLException localSQLException) {  
  11.     }  

Driver的功能

      java.sql.Driver介面規定了Driver應該具有以下功能:


其中:

acceptsURL(String url) 方法用來測試對指定的url,該驅動能否開啟這個url連線。driver對自己能夠連線的url會制定自己的協議,只有符合自己的協議形式的url才認為自己能夠開啟這個url,如果能夠開啟,返回true,反之,返回false;

例如:oracle定義的自己的url協議如下:

jdbc:oracle:thin:@//<host>:<port>/ServiceName

jdbc:oracle:thin:@<host>:<port>:<SID>

oracle自己的acceptsURL(String url)方法如下:

[java] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. publicboolean acceptsURL(String paramString) {  
  2.     if (paramString.startsWith("jdbc:oracle:")) {  
  3.         return (oracleDriverExtensionTypeFromURL(paramString) > -2);  
  4.     }  
  5.     returnfalse;  
  6. }  
  7. privateint oracleDriverExtensionTypeFromURL(String paramString) {  
  8.     int i = paramString.indexOf(58) + 1;  
  9.     if (i == 0) {  
  10.         return -2;  
  11.     }  
  12.     int j = paramString.indexOf(58, i);  
  13.     if (j == -1) {  
  14.         return -2;  
  15.     }  
  16.     if (!(paramString.regionMatches(true, i, "oracle"0, j - i))) {  
  17.         return -2;  
  18.     }  
  19.     ++j;  
  20.     int k = paramString.indexOf(58, j);  
  21.     if (k == -1) {  
  22.         return -3;  
  23.     }  
  24.     String str = paramString.substring(j, k);  
  25.     if (str.equals("thin")) {  
  26.         return0;  
  27.     }  
  28.     if ((str.equals("oci8")) || (str.equals("oci"))) {  
  29.         return2;  
  30.     }  
  31.     return -3;  
  32. }  

     由上可知oracle定義了自己應該接收什麼型別的URL,自己能開啟什麼型別的URL連線(注意:這裡acceptsURL(url)只會校驗url是否符合協議,不會嘗試連線判斷url是否有效) 。拓展閱讀:常用資料庫 JDBC URL格式

connect(String url,Properties info)方法,建立Connection物件,用來和資料庫的資料操作和互動,而Connection則是真正資料庫操作的開始(在此方法中,沒有規定是否要進行acceptsURL()進行校驗)。

手動載入驅動 Driver 並例項化進行資料庫操作的例子

[java] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. publicstaticvoid driverTest(){  
  2.     try {  
  3.         //1.載入oracle驅動類,並例項化
  4.         Driver driver = (Driver) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();  
  5.         //2.判定指定的URL oracle驅動能否接受(符合oracle協議規則)
  6.         boolean flag = driver.acceptsURL("jdbc:oracle:thin:@127.0.0.1:1521:xe");  
  7.         //標準協議測試
  8.         boolean standardFlag1 = driver.acceptsURL("jdbc:oracle:thin:@//<host>:<port>/ServiceName");  
  9.         boolean standardFlag2 = driver.acceptsURL("jdbc:oracle:thin:@<host>:<port>:<SID>");  
  10.         System.out.println("協議測試:"+flag+"\t"+standardFlag1+"\t"+standardFlag2);  
  11.         //3.建立真實的資料庫連線:
  12.         String  url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";  
  13.         Properties props = new Properties();  
  14.         props.put("user""louluan");  
  15.         props.put("password""123456");  
  16.         Connection connection = driver.connect(url, props);  
  17.         //connection 物件用於資料庫互動,程式碼省略。。。。。
  18.     } catch (Exception e) {  
  19.         System.out.println("載入Oracle類失敗!");  
  20. 相關推薦

    JDBC驅動載入原理全面解析

    本文轉載自http://blog.csdn.net/luanlouis/article/details/29850811,感謝分享 前言          最近在研究Mybatis框架,由於該框架基於JDBC,想要很好地理解和學習Mybatis,必須要

    JVM的類載入機制全面解析

    什麼是類載入機制 JVM把描述類的資料從Class檔案載入到記憶體,並對資料進行校驗、轉換解析和初始化,最終形成可以被JVM直接使用的Java型別,這就是JVM的類載入機制。 如果你對Class檔案的結構還不熟悉,可以參考之前的文章Class檔案結構全面解析(上)和Class檔案結構全面解析(下)。 歡迎關注

    IntelliJ IDEA載入JDBC驅動

    com 找到 download 5.1 con 工程 director r文件 blog 下載zip格式的驅動包:https://dev.mysql.com/downloads/connector/j/ 解壓zip,放到任意位置。其中mysql-connector-jav

    關於Class物件、類載入機制、虛擬機器執行時記憶體佈局的全面解析和推測

    簡介: 本文是對Java的類載入機制,Class物件,反射原理等相關概念的理解、驗證和Java虛擬機器中記憶體佈局的一些推測。本文重點講述瞭如何理解Class物件以及Class物件的作用。 歡迎探討,如有錯誤敬請指正 如需轉載,請註明出處 http://www.cnblogs.com/nul

    [work*] 最全面解析 Ubuntu 16.04 安裝nvidia驅動

    想在Lab的臺機上跑機器學習程式碼, 可以nvidia-smi, but一直報 AssertionError: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installe

    elasticsearch-query-tookit一款基於SQL查詢elasticsearch程式設計工具包,支援SQL解析生成DSL,支援JDBC驅動,支援和Spring、MyBatis整合

      `elasticsearch-query-tookit`是一款基於SQL查詢elasticsearch程式設計工具包,支援SQL解析生成DSL,支援JDBC驅動,支援和Spring、MyBatis整合,提供Java程式設計介面可基於此工具包二次開發  只是重新造了個輪子,

    關於idea第一次如何載入JDBC驅動

    啊,不得不說我在網上找了很久,眾說紛雲,方法都試了,雜七雜八的,很懊惱,還沒用。不過慶幸的是最後還是載入成功了。話不多說,正題開始: 第一步,你得去官網下載https://dev.mysql.com/downloads/connector/j/ 第二步,解壓壓縮包,隨便放哪

    Android WebView使用全面解析載入網路資源、本地HTML,JS互動)

    簡述:    WebView是什麼?有什麼用途?我們先來看一下官方介紹:      A View that displays web pages. This class is the basis upon which you can roll your own web b

    載入jdbc驅動程式的三種不同方式

    1.比較常用 try{ Class.forName("com.mysql.jdbc.Driver");//載入資料庫驅動 String url="jdbc:mysql:

    MySQL的JDBC驅動原始碼解析

    一、背景         MySQL是一箇中小型關係型資料庫管理系統,目前我們淘寶也使用的也非常廣泛。為了對開發中間DAO持久層的問題能有更深的理解以及最近在使用的phoenix on Hbase的SQL也是實現的JDBC規範,在遇到問題的時候能夠有更多的思路,於是研究了一

    eclipse載入jdbc驅動開發web程式(mac電腦)

    今天給大家介紹一下mac電腦的eclipse如何載入jdbc驅動,我使用的是mysql資料庫(mac版本mysql比較好安裝),首先需要準備jdbc驅動,可以在https://dev.mysql.com/downloads/connector/j/進行下載,注意:進入頁面是 我們可以看到,

    IDEA如何載入JDBC驅動,連線MySQL java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

    針對 java.lang.ClassNotFoundException:com.mysql.jdbc.Driver 是因為mysql驅動,沒安裝好,報錯如下: IDEA載入JDBC驅動的方法是: 第一步:去官網下載https://dev.mysql.c

    解決maven載入不了oracle jdbc驅動包的問題

    由於Oracle授權問題,Maven3不提供Oracle JDBC driver,為了在Maven專案中應用Oracle JDBC driver,必須手動新增到本地倉庫。 手動新增到本地倉庫需要本地有oracle驅動包,有兩種方式獲取oracle的驅動包:一種是去or

    [瘋狂Java]JDBC載入資料庫驅動、連線資料庫

    1. 載入資料庫驅動:     1) 由於Java是一個純面嚮物件語言,任何事物在其中都必須抽象成類或者類物件,資料庫也不例外,JDBC同樣也把資料庫抽象成面向物件的結構;     2) JDBC將整個資料庫驅動器在底層抽象成一個物件(即驅動器物件),所有對資料庫的操作都可

    Java類載入原理解析

    每個java開發人員對java.lang.ClassNotFoundExcetpion這個異常肯定都不陌生,這背後就涉及到了java技術體系中的類載入。Java的類載入機制是java技術體系中比較核心的部分,雖然和大部分開發人員直接打交道不多,但是對其背後的機理有一定理解有

    mysql jdbc驅動原始碼分析(驅動載入

    jdbc連結資料庫的時候我們知道有如下幾個步驟: 1、載入驅動 2、獲取資料庫連結Connection 3、獲取statement、preparedstatement 4、執行查詢、更新語句獲取結果ResultSet 5、呼叫ResultSet結果集例項的方法來獲取資料 6

    JDBC不再需要Class.forName()來顯式載入jdbc驅動

    最近在用jdbc操作資料庫時,發現沒有Class.forName("com.mysql.jdbc.Driver")這一句,也可以連上資料庫並操作。後來在java.sql.DriverManager類中找到了這行註釋 * <P>Applications no lon

    下拉重新整理、上拉載入更多控制元件實現原理解析(一)

    以前那個賬號,以後可能不用了,把文章搬過來!!! 效果預覽 接受hi大頭鬼hi的建議,來一個動態圖,方便大家知道這是個什麼東西。 動機 原理     無論是下拉重新整理還是上拉載入更多,原理都是在內容View(ListView、Re

    weblogic與Java類載入原理試驗解析

    Public class Test1{ Public static void main(String[] arg){ System.out.println(Test1.class.getClassLoader()); Test2 t2 = new Test2(); T2.

    IDEA連線sql載入jdbc驅動

    一,下載sqljdbc驅動 二,解壓壓縮包,隨便放哪都可以 三,開啟你的idea工程,按ctrl+alt+shift+s(此為開啟Project Structure),Modules --->選中<Module dependencies-->點選右側的+