1. 程式人生 > >[瘋狂Java]JDBC:載入資料庫驅動、連線資料庫

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

1. 載入資料庫驅動:

    1) 由於Java是一個純面嚮物件語言,任何事物在其中都必須抽象成類或者類物件,資料庫也不例外,JDBC同樣也把資料庫抽象成面向物件的結構;

    2) JDBC將整個資料庫驅動器在底層抽象成一個物件(即驅動器物件),所有對資料庫的操作都可以通過該物件進行;

    3) 只不過資料庫驅動物件和普通的Java物件有所不同:

         i. 首先大多數普通的Java物件都是執行該Java程式前不存在的,而是執行的時候臨時建立的,程式退出後這些物件也隨之釋放;

         ii. 但資料庫不一樣,資料庫往往是不依賴程式執行的,資料庫通常都是24小時持續執行,只不過應用程式可以訪問它而已,因此資料庫物件不能像普通物件那樣從無到有地“建立”;

         iii. 也就是說一個在應用程式執行之前就已經存在並且正常執行的資料庫例項如何在Java程式中訪問呢?

    4) 載入資料庫驅動的方法:

         i. 載入資料庫驅動其實就是將作業系統中正在執行的資料庫程序(例項)轉化成Java物件供Java程式使用(操作資料庫);

         ii. 這裡首先要了解以下類驅動器的概念:

             a. 其實在Java中任何類(Object、String等)想要正常執行,底層都要有相應的驅動器驅動它;

             b. 但是我們平時看不出來這些類物件需要什麼驅動器驅動啊!那是因為這些基礎類的驅動器就是JVM虛擬機器本身,其驅動的載入是在底層伴隨著JVM的啟動進行的,都對使用者隱藏起來了,所以你看不到;

             c. 而那些不依賴虛擬機器驅動的程式(比如非常典型的就是資料庫程式、大多數圖形程式,基本都是用C/C++編寫,肯定不能靠JVM驅動)想在Java中訪問就必須自己手動編寫載入驅動器的程式碼了!!

         iii. 手動載入類的驅動器——使用Class類的forName靜態方法:static Class<?> Class.forName(String className);

             a. className就是那個不依賴JVM驅動的外部程序的Java類名,這個類名必須符合Java命名規則,例如“com.xxx.Xxx"之類的;

             b. 你在Java中訪問外部程序(將外部程序抽象成Java類或者物件)還一定要有Java類名?那這個類名是不是要事先就準備好咯?

             c. 是的!並不是任何外部程序都可以被Java訪問,想要被Java訪問就必須讓那個程式自己準備好被Java呼叫的介面,並事先命名好Java類名才行,而程式準備好的Java介面就是該程式的Java驅動器(讓JVM控制程式行為的東西就是Java驅動器);

             d. 因此資料庫廠商必須自行別寫好資料庫的Java驅動器(稱作資料庫Connector,即聯結器,用於和Java程式連線),並準備好類名,好讓Class.forName載入它;

         iv. forName的載入原理:

             a. 首先任意一個提供Java介面的程式都會擁有一個Java類名(載入到JVM中就是用該類名來訪問該程式例項的);

             b. 這樣的程式執行後,這個Java類名就會被記錄到改程式的程序資訊中(而改程式的Java介面(驅動器)的控制代碼也會被記錄到程序資訊中);

             c. forName傳入該類名以後就會到作業系統的程序表中查詢具有該Java類名的執行緒;

             d. 找到對應的程序後就會找到該程序對應的Java驅動,然後將該驅動載入進JVM;

             e. 之後就可以在Java程式中通過這個類名(或者物件)來呼叫該程序的功能,或者訪問程序中的資料了;

    5) 資料庫廠商對驅動類名的命名:

         i. 廠商之間各不相同,而且也沒有規律可循,因此必須要查閱相應廠商的JDBC手冊才能知道;

         ii. MySQL的命名:com.sql.jdbc.Driver

         iii. Oracle的命名:oracle.jdbc.driver.OracleDriver

         iv. 從命名的包路徑來看,各個廠商驅動的實現差異較大;

!因此MySQL資料庫的載入就是:Class.forName("com.sql.jdbc.Driver");

    6) 準備好資料庫聯結器:

         i. 必須事先將資料庫的JDBC-Connector加入到CLASSPATH路徑當中,Connector由資料庫廠商提供,而MySQL的JDBC-Connector檔案是mysql-connector-java-版本號-bin.jar;

         ii. 原因很簡單,資料庫的JDBC驅動必須要執行起來才能起到作用,在Java中就是要執行該類,而執行一個類首先會想到命令"java 要執行的類的類名“了,既然要直接執行該命令,那就必須得將目標類的路徑新增到CLASSPATH中去才行,因此必須先將上面講的jar包新增到CLASSPATH路徑中去才行;

         iii. 在Eclipse中這樣設定:window -> preferences -> java -> install jres -> 選中當前採用的JRE點選edit -> add external jars -> 選擇jar包路徑儲存即可;

2. JDBC如何管理載入後的資料庫驅動——用DriverManager建立連線:

    1) forName載入完類後如果發現這是一個數據庫類的驅動那就會做一定的特殊處理了;

    2) JDBC專門(注意!“專門”)用DriverManager類來管理資料庫驅動!也就是說DriverManager類是專門用來管理JDBC驅動的!不要因為類命中沒有出現JDBC之類的字眼就認為該類還可以管理其它驅動!不!DriverManager只用來管理JDBC驅動!

    3) 載入後的驅動會被抽象成Java型別的物件儲存在DriverManager的靜態變數driver中;

    4) JDBC規定,一個Java程序只能同時持有(最多持有)一個JDBC驅動,也就是說上述的driver在載入後就有且僅有它一個了,也就是說你一次只能持有一個數據庫物件,這就不允許你一個Java程序同時連多個數據庫了;

    5) 還有一點要強調的是,資料庫訪問跟HTTP協議的原理一樣,都是基於連線的,即查詢資料庫前必須現建立連線,連線上了以後可以進行多次查詢,最後查詢完畢後關閉連線才算一次完整的資料庫操作,而這裡的要素是什麼?

         i. 那就是一個程序同時(最多)只能建立一個連線;

         ii. 這是很顯然的,一個程序就代表一個使用者,這和HTTP一樣,一個使用者不能同時向一個伺服器建立兩個連線,即同一個人要建立第二個連線除非是第一個連線已經斷開(上一次服務已經結束);

         iii. 因此載入後的驅動器driver是受到同不監視的,即driver是一個同步監視器!

    6) 可以看一下DriverManager的getConnection方法,它利用driver來建立和資料庫的連線(就跟HTTP中客戶端和伺服器端建立連線一樣一樣滴),它是一個同步方法!

public static synchronized Connection DriverManager.getConnection(String url, String user, String passwd);
!driver是DriverManager的靜態物件,該方法是同步方法,因此driver在該方法中就是同步監視器了;

!!可以看到這樣的結構就是單例模式,JDBC讓一個程序最多隻能得到一個數據庫驅動器!

    7) 看一下getConnection的引數和返回值:

         i. url:要訪問的資料庫往往都是在遠端(處在某個網路節點中),因此需要對資料庫進行定位;

            a. 這個url的寫法有講究,不同資料庫的寫法不一樣,需要參考資料庫的JDBC手冊;

            b. 但是JDBC標準還是規定了該URL的框架,其格式是:jdbc:資料庫品牌:具體定位資訊(該部分各資料庫有差異)

            c. MySQL的寫法:jdbc:mysql://hostname:port/具體資料庫名,例如"jdbc.mysql://192.23.21.9:8889/student_data

         ii. user和passwd代表使用者名稱和登陸密碼,這都是資料庫管理員分配的;

         iii. 返回值是一個Connection物件,該物件表示Java程式和資料庫所建立的一個屋裡連線會話,之後可以通過Connection物件和資料庫進行交流(操作資料庫);

    8) 建立連線的示例:Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/select_test", "root", "1234");

3. 一個完整的載入驅動建立連線的程式碼:

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/select_test");
// 利用conn和資料庫交流


相關推薦

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

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

[瘋狂Java]JDBC資料庫元資料分析

1. 資料庫元資料——有時候並不僅僅需要分析和業務邏輯相關的表,也需要分析當前資料庫的有關資訊:     1) 比如分析當前資料庫中有多少張表、當前共建立了多少外來鍵、多少索引、某個表的結果如何等等;     2) 這些都屬於描述資料庫中資料的資料,稱為元資料;     3

[瘋狂Java]JDBCResultSetMetaData(結果集元資料分析)

1. 描述ResultSet資訊的資料——ResultSetMetaData:     1) MetaData即元資料,即描述其它資料的資料,因此ResultSetMetaData就是描述ResultSet的元資料;     2) 通常在你對查詢結果不瞭解的情況下可以使用該

JAVA JDBC使用mysql8.0.jar包連線資料庫的小坑

喜歡用新不用久,所以我裝軟體基本都是遵循去下載安裝最新版本的軟體,畢竟新的軟體功能多,雖然小坑和小問題也多,但是大部分坑你搜一搜網上都有前人給你填平了,這裡記錄一下自己學習JAVA JDBC連線資料庫時的一個小問題 就是連線資料庫驅動的時(使用了mysql-connecto

JDBC資料庫驅動連線java程式操作資料庫事務隔離級別連線池等)

java操作資料庫的思想:連上資料庫,傳送sql語句。在連上資料庫之前,要先用程式啟動資料庫,因此,可以通過反射載入類驅動(com.jdbc.mysql.Driver)。通過驅動管理類的靜態方法傳遞資料庫的url來獲取一個連線物件(connection)。有三個過載的方法,第一個user和p

[瘋狂Java]集合Collection的迭代器Iterator使用Predicate篩選集合中的元素

1. Iterator——迭代器:     1) 和C++中迭代器的概念一樣,二要素:          i. 迭代器必定從屬於某個容器,其作用就是用來遍歷所屬容器中的元素的!          ii. 迭代器是在容器的資料檢視之上進行迭代,因此不能再迭代過程中修改容器中的

瘋狂Java講義》學習筆記(十)資料庫JDBC程式設計

1、JDBC基礎 JDBC的全程是Java Database Connectivity,即Java資料庫連線,它是一種可以執行SQL語句的Java API;JDBC為資料庫開發提供了標準的API,所以使用JDBC開發的資料庫應用可以跨平臺執行,而且可以跨資料

[瘋狂Java]UDP接收發送資料報獲取接收到的資料報的相關資訊

1. Java的UDP模型:     1) DatagramSocket是UDP的socket,由於它只是個碼頭只能發貨和收貨,因此它就只有兩個方法,一個是send用來發送資料報,一個即使receive用來接收資料報;     2) 由於DatagramSocket只是個碼

[瘋狂Java]SQL常量變數運算子字串匹配運算子like

1. 常量和變數以及運算:     1) SQL中的常量和C語言以及其它語言中的常量定義完全相同,就是一些字面值,比如15、'xyz'就分別是數值型字面值和字串型字面值,它們都屬於常量;     2) 而變數是可以定義在SQL指令碼中的,但是我們平時寫查詢語句中用的最多的變

java EE GenericServlet 抽象類ServletConfig 介面

ServletConfig 介面:當前 Servlet 在 web.xml 中相關配置資訊 package javax.servlet; import java.util.Enumeration; public interface ServletConfig { // 獲取當前 S

瘋狂java講義多執行緒(一)

第十六章  多執行緒(一)     並行:在同一時刻,有多條指令在多個處理器上同時執行     併發:同一時刻只有一個指令被處理器執行,但多個程序指令快速輪換執行,使得巨集觀好像多個指令在同時執行     作業系統可以同時執行多個任務,每個任務就是程序;程序可以

[瘋狂Java]集合專門用於聚集操作的一次性集合——Stream(流)

1. Java 8新增的Stream特殊集合:     1) Stream,即流,和之前講過的I/O流並非一種流,是一種特殊的有序、可重複集合,可以往流中放很多元素; !!它不屬於Collection、Map體系,但是Collection可以轉化成Stream;     2

[瘋狂Java]SQL子查詢

1. SQL標準對子查詢的定義:     1) 簡單的講就是巢狀select查詢,SQL都支援多層巢狀查詢;     2) 要求記憶體的查詢必須用括號()包起來;     3) 子查詢可以出現的位置:          i. from之後:查詢的實質就是一個臨時的檢視,因此

[瘋狂Java]陣列Arrays(陣列工具類)

1. Arrays工具類簡介:     1) 是Java提供的專門用來運算元組的工具類,裡面有一大堆靜態方法(演算法)來運算元組,低位就相當於C++ STL的<algorithm>庫,只不過Arrays裡面全部都是運算元組的演算法,於此類似的是Collectio

2019年Java螞蟻金服拼多多位元組跳動的面試總結

上午9點,我還在去公司的公交上,突然收到螞蟻的面試電話,其實算不上真正的面試。面試官只是和我聊了下他們在做的事情,說的很詳細,然後

Web安全學習筆記(十)PHP基礎(下) 之 連線資料庫

前言:         把這個總結完,對於學習的基礎也算完事了,剩下的我就要將實戰中遇到的多多分享了,也希望多結識一些志同道合,聊得來的朋友。        

Mysql01伺服器概述資料庫伺服器建立資料庫建立資料表

Mysql資料庫 day01 資料庫  儲存資料  MySQL、oracle、sql server、db2、sqlite…  關係型資料庫  資料以表格形式存放  No sql Mysql  開源免費資料庫  在網際網路領域,是最常用的資料庫  被 sun 以10

mysql(一)——更改密碼連線資料庫常用命令

13.1 設定更改root密碼 13.2 連線mysql 13.3 mysql常用命令 13.1 設定更改root密碼 預設root密碼為空,一定要設定一個密碼多一層保障。 沒有密碼時使用root登入mysql:/usr/local/mysql/bin/mysql -uroo

JDBC操作資料庫(SQL server)——連線資料庫程式碼

import java.sql.*; public class SqlLink { public static void main(String []args) { String userName = "TangHao"; String user

資料庫(DB)關係型資料庫Mysql(3種類型)mysql常用函式(3種)

一、資料庫的發展史    (1)手工管理:藏書閣,圖書館。             優點:分類管理,直觀性強             缺點:資訊流動慢,不方便    (2)檔案管理:計算機檔案系統,圖書管理系統             優點:分類管理,層次分明