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?
- //載入Oracle資料庫驅動
- Class.forName("oracle.jdbc.driver.OracleDriver");
- //載入SQL Server資料庫驅動
- Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
- //載入MySQL 資料庫驅動
- 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?
- static {
- Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
- try {
- if (defaultDriver == null) {
- //建立一個OracleDriver例項,然後註冊到DriverManager中
- defaultDriver = new OracleDriver();
- DriverManager.registerDriver(defaultDriver);
- }
- } catch (RuntimeException localRuntimeException) {
- } catch (SQLException localSQLException) {
- }
Driver的功能
java.sql.Driver介面規定了Driver應該具有以下功能:
其中:
acceptsURL(String url) 方法用來測試對指定的url,該驅動能否開啟這個url連線。driver對自己能夠連線的url會制定自己的協議,只有符合自己的協議形式的url才認為自己能夠開啟這個url,如果能夠開啟,返回true,反之,返回false;
[java] view plain copy print?例如:oracle定義的自己的url協議如下:
jdbc:oracle:thin:@//<host>:<port>/ServiceName
jdbc:oracle:thin:@<host>:<port>:<SID>
oracle自己的acceptsURL(String url)方法如下:
- publicboolean acceptsURL(String paramString) {
- if (paramString.startsWith("jdbc:oracle:")) {
- return (oracleDriverExtensionTypeFromURL(paramString) > -2);
- }
- returnfalse;
- }
- privateint oracleDriverExtensionTypeFromURL(String paramString) {
- int i = paramString.indexOf(58) + 1;
- if (i == 0) {
- return -2;
- }
- int j = paramString.indexOf(58, i);
- if (j == -1) {
- return -2;
- }
- if (!(paramString.regionMatches(true, i, "oracle", 0, j - i))) {
- return -2;
- }
- ++j;
- int k = paramString.indexOf(58, j);
- if (k == -1) {
- return -3;
- }
- String str = paramString.substring(j, k);
- if (str.equals("thin")) {
- return0;
- }
- if ((str.equals("oci8")) || (str.equals("oci"))) {
- return2;
- }
- return -3;
- }
由上可知oracle定義了自己應該接收什麼型別的URL,自己能開啟什麼型別的URL連線(注意:這裡acceptsURL(url)只會校驗url是否符合協議,不會嘗試連線判斷url是否有效) 。拓展閱讀:常用資料庫 JDBC URL格式
connect(String url,Properties info)方法,建立Connection物件,用來和資料庫的資料操作和互動,而Connection則是真正資料庫操作的開始(在此方法中,沒有規定是否要進行acceptsURL()進行校驗)。
手動載入驅動 Driver 並例項化進行資料庫操作的例子
[java] view plain copy print?
- publicstaticvoid driverTest(){
- try {
- //1.載入oracle驅動類,並例項化
- Driver driver = (Driver) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
- //2.判定指定的URL oracle驅動能否接受(符合oracle協議規則)
- boolean flag = driver.acceptsURL("jdbc:oracle:thin:@127.0.0.1:1521:xe");
- //標準協議測試
- boolean standardFlag1 = driver.acceptsURL("jdbc:oracle:thin:@//<host>:<port>/ServiceName");
- boolean standardFlag2 = driver.acceptsURL("jdbc:oracle:thin:@<host>:<port>:<SID>");
- System.out.println("協議測試:"+flag+"\t"+standardFlag1+"\t"+standardFlag2);
- //3.建立真實的資料庫連線:
- String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
- Properties props = new Properties();
- props.put("user", "louluan");
- props.put("password", "123456");
- Connection connection = driver.connect(url, props);
- //connection 物件用於資料庫互動,程式碼省略。。。。。
- } catch (Exception e) {
- System.out.println("載入Oracle類失敗!");
相關推薦
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-->點選右側的+