Java數據庫連接(英文:Java Database Connectivity,簡稱 JDBC)是一種Java應用程序編程接口(Java API),用于管理與數據庫的連接并執行查詢。JDBC面向關系型數據庫,為Java應用程序提供數據庫連接標準。
JDBC API起源于微軟的開放數據庫連接(Open DataBase Connectivity,簡稱ODBC),是Sun Microsystems公司專門為Java語言設計的處理SQL(結構化查詢語言)的接口,于1997年作為JDK 1.1的一部分發布,是最早為Java語言開發的庫之一。JDBC自發布以來,經歷了多個版本的更新和改進,以支持Java平臺和數據庫技術的發展。JDBC 4.3是現在的最新版本,于2017年9月作為Java SE 9的一部分發布。目前,JDBC API已經成為Java應用程序連接和訪問數據庫的主流技術之一,并被應用到各種框架和工具中。
JDBC API由一組用Java編程語言編寫的接口和類組成,主要接口和類有:DriverManager類、Connection接口、Statement接口等。使用這些標準接口和類,程序員可以編寫連接到數據庫的應用程序、發送用SQL編寫的查詢并處理結果。而JDBC驅動程序為特定的DBMS廠商實現了這些接口和類,可以認為,JDBC驅動程序在Java應用程序和所需數據庫之間架起一座橋梁。使用JDBC API的Java應用程序在實際連接到數據庫之前會加載特定DBMS的指定驅動程序,然后,JDBC DriverManager類將所有JDBC API調用發送到加載的驅動程序來實現數據庫的連接和訪問。
發展歷史
起源
20世紀80年代,SQL成為關系數據庫管理廣泛采用的語言。到了20世紀90年代,數據庫技術發展迅速,出現了多種類型和廠商的數據庫管理系統(DBMS),如Oracle數據庫、sybase、INFORMIX、DB2等,這些數據庫管理系統都有自己的特定的接口和協議,導致了數據庫編程的碎片化和不兼容性。為了統一對SQL數據庫的訪問,微軟于 1992年推出了開放數據庫連接(Open Database Connectivity,簡稱ODBC),一種用于連接和操作數據庫的通用 API。ODBC API是一個ODBC函數庫,獨立于編程語言和數據庫系統,它可以讓支持ODBC的應用程序連接到任何有ODBC驅動程序的數據庫,執行SQL,并獲取結果。
然而,ODBC API不適合直接用于Java編程語言,因為它使用了c語言的接口,從Java調用本地C代碼會帶來一些安全性、實現、穩健性和應用程序的自動可移植性方面的缺點。且ODBC性能較低,依賴于操作系統,不支持對象和異常,而Java是一種流行的、跨平臺的、面向對象的編程語言,它需要一種更適合自己的數據庫訪問方式。
為了解決這些問題,Sun Microsystems公司于1997年專門為Java語言設計了JDBC API,它是一個基于Java的數據庫訪問接口,可以讓Java應用程序連接到任何支持SQL的數據庫。JDBC API借鑒了ODBC的一些設計思想,它也是基于Open Group SQL CLI (Call Level 接口) 的,但是JDBC API更適合Java的特點和優勢,它使用了Java的對象和異常機制,而且不依賴于操作系統或數據庫廠商的 API,從而提高了安全性、穩健性和可移植性。JDBC API由此成為了Java語言訪問關系數據庫的標準方式。
發展
1997年 Sun Microsystems公司發布的JDBC 1.0只支持基本的SQL,沒有提供高級功能,如事務控制、結果集處理等。1999年,為了解決效率和穩定性問題,JDBC 2.0發布,增加了高級功能,如批處理更新、事務控制、數據源、行集等。JDBC API從JDBC 2.0開始分為JDBC 2.0 Core API(java.sql)和JDBC 2.0 Standard Extension API(javax.sql)。
2003年,JDBC 3.0發布,引入了保存點、返回自動生成的鍵、參數元數據等特性,以適應更復雜、更大規模的數據處理需求。這些特性使得Java程序能夠更好地處理分布式和并發的環境,提高了故障容許度和恢復能力。
2006年,JDBC 4.0發布,支持了Java SE 6的新特性,如注解、泛型、自動加載驅動等。JDBC 4.0進一步簡化了開發過程,通過引入自動加載驅動程序和增強型連接功能來提高開發人員的生產力和應用程序的可靠性,這些特性使得Java程序能夠更容易地與新的數據庫技術和標準進行集成,如SQL XML、Blob和 Clob的流式處理等。
2011年,JDBC 4.1發布,主要是為了支持Java SE 7的新特性,如try-with-resources 語句、JDBC-ODBC橋的移除、RowId生命周期提示等,使得Java程序能夠更簡潔地管理資源、更方便地訪問本地數據庫、更準確地處理RowId類型等。
2014年,JDBC 4.2發布,提供了對Java SE 8的新特性的支持,如日期和時間類型、大對象的流式處理、REF CURSOR類型等,這些特性使得Java程序能夠更好地處理新的數據類型和格式。
2017年,JDBC 4.3發布,支持了Java SE 9的新特性,如模塊化系統、Sharding API以及更多的SQL類型,這些特性使得Java程序能夠更好地適應模塊化的開發模式、更好地支持分布式和水平擴展的數據庫、更好地兼容不同的數據庫標準等。
現狀
目前,JDBC在Java平臺和數據庫技術的發展中扮演了重要的角色,為Java程序提供了一種簡單、統一、跨平臺的數據庫訪問機制,讓Java程序可以與任何支持SQL的數據庫進行通信。JDBC被廣泛應用于各種Java應用程序和框架中,例如Spring、Hibernate、JPA等,在Web開發、數據分析、企業應用、云計算等領域都有重要的作用。
JDBC應用程序模型
JDBC API支持數據庫訪問的兩層和三層客戶端-服務器模型。
兩層客戶端-服務器模型
所謂的兩層模型是指Java應用程序和目標數據庫分別安裝在兩個層次的組件上。這兩個組件分別是:
在兩層客戶端-服務器模型中,Java應用程序直接與數據庫通信,這需要一個JDBC驅動程序,它可以與被訪問的特定數據庫進行交互,用戶的命令被JDBC驅動程序傳送到數據庫或其他數據源,而這些語句的結果被發送回用戶。數據庫可以位于另一臺機器上,用戶通過網絡與之連接,這被稱為客戶端-服務器配置,用戶的機器是客戶端,數據庫所在的機器是服務器。用戶連接數據庫的網絡可以是一個內部網,例如一個公司的內部網絡,也可以是互聯網。
三層客戶端-服務器模型
三層客戶端-服務器模型是一種常用的Java數據庫應用程序的架構方式,它分為三個層次的組件,分別是客戶端層、應用程序服務器層和數據庫層。這三個層次的組件可以分別安裝在不同的機器上,通過網絡進行通信和數據交換:
使用三層模型相比兩層模型的優點包括:
JDBC API
JDBC API由一組類和接口組成,用于管理與數據庫的連接、發出查詢和命令以及處理從數據庫獲取的結果集。JDBC API提供了通過Java編程語言進行的通用數據訪問,允許用戶以相同的編碼方式訪問任何類型的關系數據庫,這意味著用戶可以使用相同的編碼開發一個程序來訪問SQL Server數據庫或Oracle數據庫,或者不修改編碼的MySQL。
JDBC API中定義的類及其功能:
參考來源:
其中,DriverManager、DriverPropertyInfo和Type類在Java數據庫編程應用中廣泛實現。DriverManager類方法用于訪問和調用JDBC驅動程序。
JDBC API中定義的接口:
參考來源:
這些接口在Java應用程序與數據庫的交互中都很流行并廣泛實現。
驅動程序
JDBC API定義了Java接口和類,程序員用它們來連接數據庫和發送查詢。JDBC驅動程序為特定的DBMS廠商實現了這些接口和類。可以認為,JDBC驅動程序在Java應用程序和所需數據庫之間架起一座橋梁。使用JDBC API的Java應用程序在實際連接到數據庫之前會加載特定DBMS的指定驅動程序。然后,JDBC DriverManager類將所有JDBC API調用發送到加載的驅動程序。
根據配置的不同,JDBC驅動程序可以分為以下四種類型。
JDBC-ODBC Bridge 驅動程序
JDBC-ODBC Bridge驅動程序使用Java的本地方法調用ODBC驅動程序,將JDBC方法調用轉換為ODBC函數調用,從而實現與數據庫的連接。
注意:在 JDBC 4.2中,JDBC-ODBC Bridge已被移除。
網絡協議全 Java 驅動程序
網絡協議全Java驅動程序使用中間件(應用程序服務器),將JDBC調用直接或間接轉換為特定供應商的數據庫協議,該驅動程序完全用Java編寫。
本地 API 部分 Java 驅動程序
本地API部分Java驅動程序使用數據庫廠商提供的客戶端庫,將JDBC方法調用轉換為數據庫API的本機調用,該驅動程序不完全用Java編寫。
本地協議全 Java 驅動程序
本地協議全Java驅動程序將JDBC調用直接轉換為供應商特定的數據庫協議,該驅動程序完全用Java編寫。
連接數據庫的步驟
步驟
使用JDBC將Java應用程序與數據庫連接需要5個步驟。這些步驟如下:
在連接數據庫之前,需要為每個數據庫加載或注冊一次驅動程序,創建與數據庫的通信通道。加載驅動程序可以通過兩種方式完成:
getConnection() 方法用于創建一個連接對象,該對象將對應于與數據庫的物理連接。可以使用兩種方式來實現:
連接建立后,可以使用Connection類的createStatement方法創建Statement對象來執行SQL查詢,Statement對象表示SQL語句的接口。例如:Statement stmt = conn.createStatement()。
創建Statement對象后,使用Statement對象的查詢方法傳入SQL查詢語句。Statement對象的查詢方法有以下3種:execute()、executeQuery()和executeUpdate(),其中executeQuery()方法用于執行查詢語句,返回一個ResultSet對象,表示結果集,如ResultSet rs = stmt.executeQuery(SQL)。
當使用 executeQuery() 方法執行查詢時,它會返回一個 ResultSet 對象,表示結果集。然后可以使用 ResultSet 對象的方法訪問從數據庫檢索的數據。如使用 ResultSet 對象的 next 方法,遍歷結果集:while (rs.next()) { }。
當使用完 Connection 、 Statement 或 ResultSet 對象時,調用其 close 方法以立即釋放其正在使用的資源。如依次關閉結果集、語句對象、數據庫連接對象:rs.close(); stmt.close(); 康涅狄格學院close()。
這 5 個步驟只是 Java 應用程序連接數據庫的一般步驟,如有需要,可以根據實際開發情況進行數據庫連接。比如,如果在注冊驅動程序前沒有導入包,可以使用import java.SQL.*導入 java.sql。再比如,使用 try-with-resources 語句自動關閉 Connection、ResultSet 和 Statement 類型的資源,可以避免顯式的連接關閉步驟,簡化代碼。
示例
下面是一個使用JDBC連接MySQL的示例:
執行結果
使用 JDBC API 執行 SQL 語句,返回的可能是結果集、更新計數或輸出參數。
SQL 查詢結果集對應于接口 java.sql.ResultSet 的實例對象。ResultSet 對象一般由 Statement、PreparedStatement 或 CallableStatement 對象的 executeQuery() 或 execute() 方法返回。ResultSet 對象不僅記錄了查詢集結果中的每行數據,同時也記錄了各列的類型信息。ResultSet 對象的主要方法有以下幾類:
使用 Statement 或 PreparedStatement 對象的 executeUpdate() 方法執行更新語句時,返回結果是一個 int 值,表示更新的行數,這就是更新計數。更新計數可以用來判斷 SQL 語句是否執行成功。
輸出參數是一種特殊的參數,可以用來從存儲過程或者函數中返回值,而不是從結果集中返回值。一般由 CallableStatement 對象的 registerOutParameter() 方法輸出參數的類型和位置,execute() 方法執行存儲過程或者函數,以及使用 getXXX() 方法來獲取輸出參數的值,其中 XXX 表示輸出參數的數據類型,比如getInt()、getString() 等。
輸出參數的值可以用來進行邏輯判斷、統計或者顯示,或者作為其他 SQL 語句的輸入參數。一般來說,如果輸出參數有值,表示執行成功,如果輸出參數沒有值,表示執行失敗或者沒有返回任何值。
參考資料 >
The material in this chapter is based on JDBC tm API Tutorial.[Top] [Prev] [Next] Introduction NOTE.2024-02-07
Lesson: JDBC Introduction (The Java? Tutorials > JDBC Database Access).Documentation.2024-02-07
API Documentation.JAVA.2024-02-07
SUN SHIPS JDK 1.1 -- JAVABEANS INCLUDED.JAVA.2024-02-07
TheJavaCommunityProcess(SM)Program.JAVA Community process.2024-02-07
Oracle JDBC.Oracle.2024-02-07
Spring Framework.Data Access with JDBC .2024-02-07
Hibernate ORM 5.4.33.Final User Guide.Table of Contents.2024-02-07
Persistence (Release 7).Part VIII.2024-02-07
IBM Documentation.IBM.2024-02-07
IBM Documentation.IBM.2024-02-07
A Timeline of Data base History.Quickbase.2024-02-07
Linux/UNIX ODBC.What is ODBC?.2024-02-07
The material in this chapter is based on JDBC tm API Tutorial.[Top] [Prev] [Next] Introduction NOTE.2024-02-07
JDK5.0JavaDatabaseConnectivity(JDBC).related APIs & Developer Guides -- from Sun Microsystems.2024-02-07
Connection interface: JDBC 4.0 features.java.sql..2024-02-07
JDBC 4.1-only features.JAVA.2024-02-07
JDBC 4.2.Java Documentation.2024-02-07
Package java.sql.(Java SE 10 & JDK 10 ).2024-02-07
JDBC Architecture.The Java? Tutorials > JDBC Database Access > JDBC Introduction.2024-02-07
Package java.sql.(Java SE 19 & JDK 19).2024-02-07
About Database Adapters.JDBC Drivers.2024-02-07
JDBC-ODBC Bridge.Java SE Documentation.2024-02-07
JDBC Driver.javatpoint.2024-02-07
Java JDBC API.Java Documentation.2024-02-07
Establishing a Connection.The Java? Tutorials > JDBC Database Access > JDBC Basics.2024-02-07
Processing SQL Statements with JDBC.The Java? Tutorials > JDBC Database Access > JDBC Basics.2024-02-07
The material in this chapter is based on JDBC tm API Tutorial a.[Top] [Prev] [Next] Connection NOTE.2024-02-07
The material in this chapter is based on JDBC tm API Tutorial an.[Top] [Prev] [Next] ResultSet NOTE.2024-02-07
The material in this chapter is based on JDBC tm API Tut.[Top] [Prev] [Next] CallableStatement NOTE.2024-02-07