概念
JDBC是J2EE的標准規范之一,J2EE就是為了規范JAVA解決企業級應用開發制定的一系列規范,JDBC也不例外。
JDBC是用於Java編程語言和數據庫之間的數據庫無關連接的標准Java API。
換句話說,使用JAVA語言連接數據庫進行操作,就需要使用JDBC API。
統一的JDBC API接口,屏蔽了底層數據庫的細節,可以使用一致性的編碼(跨數據庫)對數據庫進行操作。
通過JDBC將JAVA應用於數據庫訪問連接進行解耦,可以相互獨立發展,又能夠結合使用。
簡言之,
JDBC就是對於java編碼來說,在應用程序和數據庫之間的一個中間層 API
有了中間層JDBC,你就可以面向JDBC API進行編程,不需要關注底層數據庫細節。
可以認為JDBC代理了對於數據庫的操作與訪問,也可以認為JDBC將數據庫的訪問適配成一致性的訪問接口,也可以理解成JDBC是對數據庫訪問的一層封裝
不管怎么理解,他就是那么一套API的存在。
官方文檔:
https://www.oracle.com/technetwork/java/javase/jdbc/index.html
Java數據庫連接(JDBC) API是Java編程語言和一系列SQL數據庫以及其他表格數據源,比如電子表格或文本文件之間的一個數據庫連接的行業標准。
JDBC API為基於sql的數據庫訪問提供了一個調用級API。
JDBC技術允許您使用Java編程語言為需要訪問企業數據的應用程序開發“一次編寫,到處運行”的功能。
使用啟用JDBC技術的驅動程序,您甚至可以在異構環境中連接所有企業數據
更詳細的官方文檔:
JDBC功能核心
數據庫查詢
下圖為windows cmd登錄MYSQL查詢數據的過程,主要是三個步驟:
- 連接數據庫
- 執行SQL
- cmd打印結果
JDBC用於JAVA應用程序與數據庫的連接訪問,是應用程序與數據庫的中間層
但是不管怎樣,他仍舊是要操作數據庫,所以也需要連接和查詢
cmd 作為客戶端進行查詢時,僅僅將信息打印出來就好了,這就是對cmd對數據庫結果的處理
JDBC需要為JAVA應用程序服務,需要將結果交付到應用程序中,所以JDBC還需要對返回的數據進行處理。
所以JDBC連接數據庫進行查詢也是大致三個步驟
- 連接數據庫
- 執行SQL
- 處理返回結果
JDBC架構設計
JDBC主要包括兩類接口:
- 提供了一套純粹的JAVA API給應用程序開發者
- 提供了一套低級別的JDBC driver API給數據庫驅動開發者
應用程序開發者借助於API用於開發可以訪問數據庫的程序;
驅動開發者借助於API進而提供服務到JDBC;
而
提供給數據庫驅動開發者的API則正好是為了實現提供給應用程序開發者的這套API,這句話有些令人迷惑
JDBC是對數據庫操作訪問的薄層封裝,應用程序開發者借助於JDBC可以實現對數據庫的操作訪問,但是,最終提供的服務仍舊是數據庫
是具體的數據庫實現了具體SQL的執行
所以JDBC提供給應用程序開發者的API就是開發者使用JDBC訪問數據庫的接口
而提供給數據庫驅動開發者的API則恰恰是為了讓數據庫驅動開發者來提供服務
接口與實現分離,是一種橋接模式的思想(可以參閱本人的橋接模式的文章)
理解了橋接模式就可以很好的理解這種“面向接口”的編程思維,將接口與實現進行分離。
接口提供出來用於應用程序開發者使用,數據庫或者工具廠商負責提供實現。
JDBC的接口與實現之間,通過Driver Manager 進行聯結
JDBC API從Driver Manager獲取服務,Driver Manager用來管理驅動程序,驅動程序可以很方便的注冊到管理器中
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
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 theDriverManager
在安全管理器(如applet)中運行的代碼試圖通過驅動程序管理器設置日志流時,提供權限 -
Driver
interface 接口 -- provides the API for registering and connecting drivers based on JDBC technology ("JDBC drivers"); generally used only by theDriverManager
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 fromStatement
) 用於發送准備好的語句或基本SQL語句(從Statement派生) -
CallableStatement
-- used to call database stored procedures (derived fromPreparedStatement
) 用於調用數據庫存儲過程(從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 SQLARRAY SQL ARRAY映射
-
Blob
interface 接口-- mapping for SQLBLOB SQL BLOB映射
-
Clob
interface接口 -- mapping for SQLCLOB SQL CLOB 映射
-
Date
class 類-- mapping for SQLDATE
-
NClob
interface 接口 -- mapping for SQLNCLOB
-
Ref
interface 接口-- mapping for SQLREF
-
RowId
interface 接口-- mapping for SQLROWID
-
Struct
interface 接口-- mapping for SQLSTRUCT
-
SQLXML
interface 接口-- mapping for SQLXML
-
Time
class 類-- mapping for SQLTIME
-
Timestamp
class 類-- mapping for SQLTIMESTAMP
-
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 aResultSet
object 提供有關ResultSet對象的列的信息 -
ParameterMetaData
interface -- provides information about the parameters toPreparedStatement
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 拋出以指示批處理更新中並非所有命令都已成功執行
-
核心
驅動管理器
DriverManager 管理一組JDBC驅動程序的基本服務。
連接
Connection 與特定數據庫的連接(會話)。在連接上下文中執行 SQL 語句並返回結果。
執行對象
Statement 用於執行靜態 SQL 語句並返回它所生成結果的對象。
結果集
ResultSet 表示數據庫結果集的數據表,通常通過執行查詢數據庫的語句生成。
一般流程
第一個JDBC示例
准備
以MYSQL為例,需要MYSQL驅動
數據庫表、數據准備,本地安裝了MYSQL,有數據庫sampledb,內有表student,內容如下圖
導包
比如在IDEA中,我的操作如下
示例代碼
此示例代碼只為最基本查詢,並不完善
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 { //1、注冊驅動 Class.forName("com.mysql.jdbc.Driver"); //數據庫連接所需參數 String user = "root"; String password = "123456"; String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8"; //2、獲取連接對象 Connection conn = DriverManager.getConnection(url, user, password); //設置sql語句 String sql = "select * from student"; //3、獲得sql語句執行對象 Statement stmt = conn.createStatement(); //4、執行sql並保存結果集 ResultSet rs = stmt.executeQuery(sql); //5、處理結果集 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)); } //6、資源關閉 rs.close(); stmt.close(); conn.close(); } }
結果
總結
JDBC就是JAVA語言開發需要連接數據庫的應用程序 ,所需要使用的JAVA API
提供了數據庫驅動程序的管理,連接,語句執行,以及結果返回等工作,是應用程序與數據庫之間的薄層封裝
JDBC的理念遵循依賴倒置原則,面向抽象進行編程,通過橋接模式將抽象與實現繼續分離
即保證了應用程序開發者通過JDBC對數據庫訪問操作的一致性,又可以使得數據庫獨立發展
通過驅動管理器驅動程序可以方便的注冊進來進而通過JDBC提供服務。
JDBC簡化了對數據庫訪問操作的復雜度,屏蔽了應用程序對底層數據庫的依賴,將數據庫的操作訪問過程進行抽象分步,只需要按照既有的模塊化流程就可以完成操作。
JDBC的核心內容就是與數據庫建立連接,發送SQL語句,處理結果。
原文地址:
JDBC設計理念淺析 JDBC簡介(一)