JDBC設計理念淺析 JDBC簡介(一)

概念

JDBC是J2EE的標準規範之一,J2EE就是爲了規範JAVA解決企業級應用開發制定的一系列規範,JDBC也不例外。
JDBC是用於Java編程語言和數據庫之間的數據庫無關鏈接的標準Java API。
換句話說,使用JAVA語言鏈接數據庫進行操做,就須要使用JDBC API。
統一的JDBC API接口,屏蔽了底層數據庫的細節,可使用一致性的編碼(跨數據庫)對數據庫進行操做。
經過JDBC將JAVA應用於數據庫訪問鏈接進行解耦,能夠相互獨立發展,又可以結合使用。
image_5c3be495_6ef5
簡言之, JDBC就是對於java編碼來講,在應用程序和數據庫之間的一箇中間層 API
有了中間層JDBC,你就能夠面向JDBC API進行編程,不須要關注底層數據庫細節。
能夠認爲JDBC代理了對於數據庫的操做與訪問,也能夠認爲JDBC將數據庫的訪問適配成一致性的訪問接口,也能夠理解成JDBC是對數據庫訪問的一層封裝
無論怎麼理解,他就是那麼一套API的存在。
官方文檔:
https://www.oracle.com/technetwork/java/javase/jdbc/index.html
image_5c3be495_394d
Java數據庫鏈接(JDBC) API是Java編程語言和一系列SQL數據庫以及其餘表格數據源,好比電子表格或文本文件之間的一個數據庫鏈接的行業標準。
JDBC API爲基於sql的數據庫訪問提供了一個調用級API。
JDBC技術容許您使用Java編程語言爲須要訪問企業數據的應用程序開發「一次編寫,處處運行」的功能。
使用啓用JDBC技術的驅動程序,您甚至能夠在異構環境中鏈接全部企業數據
更詳細的官方文檔:

JDBC功能核心

數據庫查詢

下圖爲windows cmd登陸MYSQL查詢數據的過程,主要是三個步驟:
  • 鏈接數據庫
  • 執行SQL
  • cmd打印結果
image_5c3be495_63dc
JDBC用於JAVA應用程序與數據庫的鏈接訪問,是應用程序與數據庫的中間層
可是無論怎樣,他仍舊是要操做數據庫,因此也須要鏈接和查詢
cmd 做爲客戶端進行查詢時,僅僅將信息打印出來就行了,這就是對cmd對數據庫結果的處理
JDBC須要爲JAVA應用程序服務,須要將結果交付到應用程序中,因此JDBC還須要對返回的數據進行處理。
 
因此JDBC鏈接數據庫進行查詢也是大體三個步驟
  1. 鏈接數據庫
  2. 執行SQL
  3. 處理返回結果
image_5c3be495_249e

JDBC架構設計

JDBC主要包括兩類接口:
  • 提供了一套純粹的JAVA API給應用程序開發者 
  • 提供了一套低級別的JDBC driver API給數據庫驅動開發者
應用程序開發者藉助於API用於開發能夠訪問數據庫的程序;
驅動開發者藉助於API進而提供服務到JDBC;
image_5c3be496_497b
提供給數據庫驅動開發者的API則正好是爲了實現提供給應用程序開發者的這套API,這句話有些使人迷惑
JDBC是對數據庫操做訪問的薄層封裝,應用程序開發者藉助於JDBC能夠實現對數據庫的操做訪問,可是,最終提供的服務仍舊是數據庫
是具體的數據庫實現了具體SQL的執行
因此JDBC提供給應用程序開發者的API就是開發者使用JDBC訪問數據庫的接口
而提供給數據庫驅動開發者的API則偏偏是爲了讓數據庫驅動開發者來提供服務
接口與實現分離,是一種橋接模式的思想(能夠參閱本人的橋接模式的文章)
理解了橋接模式就能夠很好的理解這種「面向接口」的編程思惟,將接口與實現進行分離。
接口提供出來用於應用程序開發者使用,數據庫或者工具廠商負責提供實現。
 
JDBC的接口與實現之間,經過Driver Manager 進行聯結
JDBC API從Driver Manager獲取服務,Driver Manager用來管理驅動程序,驅動程序能夠很方便的註冊到管理器中
image_5c3be496_6c2e

JDBC API

JDBC基本步驟有三個:鏈接、執行SQL、處理結果
另外還須要驅動管理器對註冊的驅動程序進行管理
既然是代碼,必然可能出現異常,因此還須要對相關異常進行處理
爲了可以更好地將SQL類型數據映射到應用程序還提供了更豐富的映射
有的時候不只僅是應用程序對數據庫數據集進行檢索,可能還須要數據庫自身的相關信息(元數據 )
ps:數據是指普通文件中的實際數據,而元數據指用來描述一個文件的特徵的系統數據,諸如訪問權限、文件擁有者以及文件數據塊的分佈信息(inode...)等等。
在JAVA中一切皆爲對象,因此這些全部的元素,都被抽象爲對象
鏈接、語句、結果、映射、元數據、異常、驅動管理器
https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/
https://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html

官方相關介紹

What the  java.sql Package Contains html

The  java.sql package contains API for the following:
  • Making a connection with a database via the  DriverManager facility   經過驅動管理器工具與數據庫創建鏈接
    • DriverManager class 類 -- makes a connection with a driver 與驅動程序創建鏈接
    • SQLPermission class 類-- provides permission when code running within a Security Manager, such as an applet, attempts to set up a logging stream through the  DriverManager在安全管理器(如applet)中運行的代碼試圖經過驅動程序管理器設置日誌流時,提供權限
    • Driver interface 接口 -- provides the API for registering and connecting drivers based on JDBC technology ("JDBC drivers"); generally used only by the  DriverManager class提供基於JDBC技術的驅動程序註冊和鏈接API(「JDBC驅動程序」);一般只被DriverManager類使用
    • DriverPropertyInfo class 類 -- provides properties for a JDBC driver; not used by the general user 爲JDBC驅動程序提供屬性;通常用戶不使用
  • Sending SQL statements to a database  向數據庫發送SQL語句
    • Statement -- used to send basic SQL statements  執行對象,用於發送基本的SQL語句
    • PreparedStatement -- used to send prepared statements or basic SQL statements (derived from  Statement)  用於發送準備好的語句或基本SQL語句(從Statement派生)
    • CallableStatement -- used to call database stored procedures (derived from  PreparedStatement )  用於調用數據庫存儲過程(從PreparedStatement 派生) 
    • Connection interface 接口 -- provides methods for creating statements and managing connections and their properties  提供用於建立語句和管理鏈接及其屬性的方法
    • Savepoint -- provides savepoints in a transaction  在事務中提供Savepoint保存點
  • Retrieving and updating the results of a query   檢索和更新查詢的結果
    • ResultSet interface 接口
  • Standard mappings for SQL types to classes and interfaces in the Java programming language   SQL類型到Java編程語言中的類和接口的標準映射
    • Array interface 接口-- mapping for SQL  ARRAY   SQL ARRAY映射
    • Blob interface 接口-- mapping for SQL  BLOB     SQL BLOB映射
    • Clob interface接口 -- mapping for SQL  CLOB     SQL CLOB 映射
    • Date class 類-- mapping for SQL  DATE
    • NClob interface 接口 -- mapping for SQL  NCLOB
    • Ref interface 接口-- mapping for SQL  REF
    • RowId interface 接口-- mapping for SQL  ROWID
    • Struct interface 接口-- mapping for SQL  STRUCT
    • SQLXML interface 接口-- mapping for SQL  XML
    • Time class 類-- mapping for SQL  TIME
    • Timestamp class 類-- mapping for SQL  TIMESTAMP
    • Types class 類-- provides constants for SQL types        爲SQL類型提供常量
  • Custom mapping an SQL user-defined type (UDT) to a class in the Java programming language   自定義將SQL用戶定義類型(UDT)映射到Java編程語言中的類
    • SQLData interface -- specifies the mapping of a UDT to an instance of this class     指定UDT到該類實例的映射
    • SQLInput interface -- provides methods for reading UDT attributes from a stream    提供從流中讀取UDT屬性的方法
    • SQLOutput interface -- provides methods for writing UDT attributes back to a stream     提供將UDT屬性寫回流的方法
  • Metadata     元數據
    • DatabaseMetaData interface -- provides information about the database       提供有關數據庫的信息
    • ResultSetMetaData interface -- provides information about the columns of a  ResultSet object      提供有關ResultSet對象的列的信息
    • ParameterMetaData interface -- provides information about the parameters to  PreparedStatement commands    爲PreparedStatement命令提供有關參數的信息
  • Exceptions   異常
    • SQLException -- thrown by most methods when there is a problem accessing data and by some methods for other reasons   當訪問數據存在問題時大多數方法都會拋出這個異常,還有一些方法是其餘緣由拋出這個異常。
    • SQLWarning -- thrown to indicate a warning   拋出以表示警告
    • DataTruncation -- thrown to indicate that data may have been truncated  拋出以指示數據可能已被截斷
    • BatchUpdateException -- thrown to indicate that not all commands in a batch update executed successfully  拋出以指示批處理更新中並不是全部命令都已成功執行

核心

image_5c3be496_3c25
驅動管理器 
DriverManager 管理一組JDBC驅動程序的基本服務。
鏈接 
Connection 與特定數據庫的鏈接(會話)。在鏈接上下文中執行 SQL 語句並返回結果。
執行對象
Statement  用於執行靜態 SQL 語句並返回它所生成結果的對象。
結果集
ResultSet 表示數據庫結果集的數據表,一般經過執行查詢數據庫的語句生成。
 

通常流程

image_5c3be496_203c

第一個JDBC示例

準備

以MYSQL爲例,須要MYSQL驅動
image_5c3be496_4374
數據庫表、數據準備,本地安裝了MYSQL,有數據庫sampledb,內有表student,內容以下圖
image_5c3be496_4908

導包

好比在IDEA中,個人操做以下
image_5c3be496_1185

示例代碼

此示例代碼只爲最基本查詢,並不完善
package jdbc.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* 第一個JDBC
* @author noteless
*/
public class FirstJDBC {
public static void main(String[] args) throws Exception {
    //一、註冊驅動
    Class.forName("com.mysql.jdbc.Driver");
    //數據庫鏈接所需參數
    String user = "root";
    String password = "123456";
    String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8";
    //二、獲取鏈接對象
    Connection conn = DriverManager.getConnection(url, user, password);
    //設置sql語句
    String sql = "select * from student";
    //三、得到sql語句執行對象
    Statement stmt = conn.createStatement();
    //四、執行sql並保存結果集
    ResultSet rs = stmt.executeQuery(sql);
    //五、處理結果集
    while (rs.next()) {
        System.out.print("id:" + rs.getInt(1));
        System.out.print(",姓名:" + rs.getString(2));
        System.out.print(",年齡:" + rs.getInt(3));
        System.out.println(",性別:" + rs.getString(4));
    }
    //六、資源關閉
    rs.close();
    stmt.close();
    conn.close();
}
}

結果

image_5c3be496_7793

總結

JDBC就是JAVA語言開發須要鏈接數據庫的應用程序 ,所須要使用的JAVA API
提供了數據庫驅動程序的管理,鏈接,語句執行,以及結果返回等工做,是應用程序與數據庫之間的薄層封裝
JDBC的理念遵循依賴倒置原則,面向抽象進行編程,經過橋接模式將抽象與實現繼續分離
即保證了應用程序開發者經過JDBC對數據庫訪問操做的一致性,又可使得數據庫獨立發展
經過驅動管理器驅動程序能夠方便的註冊進來進而經過JDBC提供服務。
JDBC簡化了對數據庫訪問操做的複雜度,屏蔽了應用程序對底層數據庫的依賴,將數據庫的操做訪問過程進行抽象分步,只須要按照既有的模塊化流程就能夠完成操做。
JDBC的核心內容就是與數據庫創建鏈接,發送SQL語句,處理結果。  
相關文章
相關標籤/搜索