Java數據庫連接
Java數據庫連接(JDBC)是一個Java應用程序編程接口(Java API),用于管理與數據庫的連接并執行查詢。JDBC面向關系數據庫,并為Java應用程序提供數據庫連接標準。
JDBC API源于微軟的開放式數據庫連接(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類、連接接口、語句接口等。使用這些標準接口和類,程序員可以編寫連接到數據庫的應用程序,發送用SQL編寫的查詢并處理結果。JDBC驅動程序為特定的DBMS供應商實現這些接口和類,可以將其視為Java應用程序和所需數據庫之間的橋梁。使用JDBC API的Java應用程序將在實際連接到數據庫之前加載特定DBMS的指定驅動程序。然后,JDBC驅動管理器類將把所有JDBC API調用發送給加載的驅動程序,以實現對數據庫的連接和訪問。
發展歷史 編輯本段
起源
20世紀80年代,SQL成為關系數據庫管理中廣泛使用的語言。20世紀90年代,數據庫技術迅速發展,出現了許多類型和供應商的數據庫管理系統,如Oracle、Sybase、Informix、DB2等。這些數據庫管理系統都有自己特定的接口和協議,這導致了數據庫編程的碎片化和不兼容性。為了統一對SQL數據庫的訪問,微軟公司于1992年推出了開放式數據庫連接(ODBC),這是一種用于連接和操作數據庫的通用API。ODBC API是一個獨立于編程語言和數據庫系統的ODBC函數庫。它允許支持ODBC的應用程序使用ODBC驅動程序連接到任何數據庫,執行SQL語句并獲得結果。
但是,ODBC API并不直接適用于Java編程語言,因為它使用了C語言的接口。從Java調用本地C代碼會給應用程序的安全性、實現、健壯性和自動移植性帶來一些缺點。而且ODBC的性能很低,依賴于操作系統,不支持對象和異常。Java是一種流行的、跨平臺的、面向對象的編程語言,它需要一種更合適的數據庫訪問方法。
為了解決這些問題,太陽微系統公司于1997年專門為Java語言設計了JDBC API。它是基于Java的數據庫訪問接口,允許Java應用程序連接到任何支持SQL的數據庫。JDBC API借鑒了ODBC的一些設計思想,也是基于Open Group SQL CLI(調用級接口)的。但是,JDBC API更適合Java的特點和優勢。它使用Java對象和異常機制,并且不依賴于操作系統或數據庫供應商的API,從而提高了安全性、健壯性和可移植性。Jdbapi因此成為Java語言訪問關系數據庫的標準方式。
發展
Sun Microsystems于1997年發布的JDBC 1.0僅支持基本的SQL語句,但不提供高級功能,如事務控制和結果集處理。1999年,為了解決效率和穩定性問題,JDBC 2.0發布,增加了高級功能,如批量更新、事務控制、數據源、行集等。JDBC API分為JDBC 2.0核心API(Java . SQL)和JDBC 2.0的JDBC 2.0標準擴展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的新功能提供了支持,例如日期和時間類型、大型對象的流處理、引用游標類型等。這些特性使Java程序能夠更好地處理新的數據類型和格式。
2017年發布了JDBC 4.3,它支持Java SE 9的新功能,如模塊化系統、分片API和更多SQL類型。這些特性使Java程序能夠更好地適應模塊化開發模式,更好地支持分布式和水平擴展的數據庫,并更好地兼容不同的數據庫標準。
狀態
目前,JDBC在Java平臺和數據庫技術的發展中發揮著重要作用,它為Java程序提供了簡單、統一和跨平臺的數據庫訪問機制,使得Java程序可以與任何支持SQL的數據庫進行通信。JDBC廣泛應用于各種Java應用程序和框架中,如Spring、Hibernate、JPA等。它在Web開發、數據分析、企業應用、云計算等領域發揮著重要作用。
程序模型 編輯本段
JDBC API支持兩層和三層客戶-服務器模式的數據庫訪問。
雙層客戶機-服務器模型
所謂兩層模型是指Java應用程序和目標數據庫分別安裝在兩層組件上。這兩個組成部分是:
應用層:安裝在客戶端機器上,包括:
JDBC驅動程序:用于連接數據庫和執行SQL語句;
用戶界面:用于與用戶交互和顯示數據;
Java應用:用于實現業務邏輯和數據處理。
數據庫層:安裝在數據庫服務器上,包括:
RDBMS:用于管理和存儲數據;
數據庫:用于存儲特定的數據表和記錄。
在兩層客戶機-服務器模型中,Java應用程序直接與數據庫通信,這需要一個JDBC驅動程序,它可以與被訪問的特定數據庫進行交互。JDBC驅動程序將用戶的命令傳輸到數據庫或其他數據源,并將這些語句的結果返回給用戶。數據庫可以位于另一臺機器上,用戶通過網絡連接到它。這稱為客戶端-服務器配置。用戶的機器是客戶端,數據庫所在的機器是服務器。用戶連接到數據庫的網絡可以是內部網,如公司的內部網或互聯網。
三層客戶機-服務器模型
三層客戶機-服務器模型是Java數據庫應用程序的常用體系結構,它分為三個組件級別,即客戶機層、應用服務器層和數據庫層。這三個級別的組件可以分別安裝在不同的機器上,通過網絡進行通信和數據交換:
客戶端層:用戶和應用程序之間的接口,可以是Web瀏覽器、桌面應用程序或移動應用程序。客戶端層通常包括一些特定于語言的虛擬機,如Java虛擬機或。NET虛擬機,用于運行應用程序代碼。客戶端層向應用服務器層發送數據操作請求,如查詢、插入、更新或刪除數據,然后接收應用服務器層返回的數據或結果并顯示給用戶。
應用服務器層:負責處理業務邏輯或應用邏輯,如驗證用戶身份、計算數據、生成報表等。應用服務器層可以使用Java Web應用程序或Java Web服務來實現,它們可以運行在Web服務器上,例如Tomcat或Jetty。應用服務器層包含用于連接數據庫和執行SQL語句的JDBC API。應用服務器層接收客戶端層的數據操作請求,然后根據請求的內容向數據庫層發送相應的SQL語句,并將數據庫層返回的數據或結果轉換為客戶端層可以識別的格式,例如XML或JSON,并將其發送回客戶端層。
數據庫層:負責數據存儲,包括關系數據庫管理系統(RDBMS)和數據庫。數據庫層可以安裝在數據庫服務器上,如MySQL、Oracle或SQL Server。數據庫層接收應用服務器層的SQL語句,然后根據SQL語句的內容對數據庫執行相應的操作,例如查詢、插入、更新或刪除數據,并將操作的結果或數據返回給應用服務器層。
與兩層模型相比,使用三層模型的優勢包括:
通過將應用服務器層與數據庫層分離,應用服務器層可以并發處理多個客戶端層的請求,而數據庫層可以專注于數據管理和存儲,這可以大大提高應用程序的性能。
業務邏輯與數據庫明確分離,應用服務器層可以根據需求進行修改或更新,而不會影響數據庫層的結構和數據,使應用程序更易于維護和擴展;客戶端層可以使用簡單的協議(如HTTP或SOAP)訪問應用服務器層,而無需了解數據庫層的詳細信息,如數據庫的類型、地址、用戶名和密碼,這可以提高客戶端層的安全性和可移植性。
JDBC API
JDBC API定義了程序員用來連接數據庫和發送查詢的Java接口和類。JDBC驅動程序為特定的DBMS供應商實現了這些接口和類。可以說JDBC驅動程序在Java應用程序和所需的數據庫之間架起了一座橋梁。使用JDBC API的Java應用程序將在實際連接到數據庫之前加載特定DBMS的指定驅動程序。然后,JDBC驅動管理器類將所有JDBC API調用發送給加載的驅動程序。
根據不同的配置,JDBC驅動程序可分為以下四種類型。
JDBC-ODBC橋驅動程序
JDBC-ODBC橋驅動程序使用Java的本地方法調用ODBC驅動程序,并將JDBC方法調用轉換為ODBC函數調用,從而實現與數據庫的連接。
優勢特點 編輯本段
優勢
使用方便;您可以輕松連接到任何數據庫。
缺點:由于JDBC方法調用被轉換為ODBC函數調用,性能下降;ODBC驅動程序需要安裝在客戶端計算機上。
注意:在JDBC 4.2中,JDBC-ODBC橋已被刪除。
網絡協議全Java驅動程序
網絡協議的完整Java驅動程序使用中間件(應用服務器)直接或間接將JDBC調用轉換為特定供應商的數據庫協議。驅動程序完全是用Java編寫的。
基于服務器,客戶端計算機上不需要JDBC驅動程序代碼;跨平臺,完全Java實現,適合網絡應用。
劣勢
需要在服務器端安裝數據庫中間層,增加了網絡開銷和維護成本。
本地API部分Java驅動程序
本地API的Java驅動程序使用數據庫供應商提供的客戶端庫將JDBC方法調用轉換為數據庫API的本地調用,該調用并不完全是用Java編寫的。
需要安裝特定于數據庫的API在客戶端;不跨平臺,不完全Java實現。本地協議全Java驅動程序本地協議全Java驅動程序直接將JDBC調用轉換為供應商特定的數據庫協議,并且該驅動程序完全用Java編寫。
鏈接步驟 編輯本段
使用JDBC將Java應用程序與數據庫連接起來需要五個步驟。這些步驟如下:
注冊驅動程序
在連接數據庫之前,需要為每個數據庫加載或注冊一次驅動程序,以創建與數據庫的通信通道。加載驅動程序有兩種方式:
靜態注冊:使用class . forname(driverName)的方法,其中driverName是驅動程序的全限定類名,如com . MySQL . CJ . JDBC . driver;;動態注冊:使用drivermanager。register driver(driver)方法,其中driver是驅動程序的實例,例如new com.mysql.jdbc.Driver()。
連接建立
getConnection()方法用于創建一個連接對象,該對象對應于與數據庫的物理連接。這可以通過兩種方式實現:
getconnection(URL,用戶名,密碼):使用三個參數,URL,用戶名和密碼,例如connection conn = driver manager . getconnection(URL,用戶,密碼);
GetConnection(URL):只有一個參數URL,它包含用戶名和密碼。不同的關系數據庫有不同的JDBC連接字符串,例如Oracle數據庫:JDBC: Oracle:瘦:@主機名:端口:服務名。
執行查詢
建立連接后,可以使用Connection類的createStatement方法創建一個Statement對象來執行SQL查詢,Statement對象表示SQL語句的接口。例如:statement stmt = conn . create statement()。
創建Statement對象后,使用Statement對象的query方法傳入SQL查詢語句。語句對象有三種查詢方法:execute()、executeQuery()和executeUpdate(),其中executeQuery()方法用于執行查詢語句并返回一個ResultSet對象,表示結果集,例如ResultSet RS = stmt。執行查詢。
處理結果集
當使用executeQuery()方法執行查詢時,它返回一個代表結果集的ResultSet對象。然后可以使用ResultSet對象的方法來訪問從數據庫中檢索的數據。如果使用ResultSet對象的next方法,則遍歷結果集:while(RS . next()){ }。
關閉連接
當連接、語句或ResultSet對象完成時,調用其close方法以立即釋放它正在使用的資源。比如依次關閉結果集、語句對象和數據庫連接對象:RS . close();stmt . close();conn.close()。
這五個步驟只是Java應用程序連接數據庫的一般步驟。如果需要,可以根據實際開發情況連接數據庫。例如,如果在注冊驅動程序之前沒有導入包,可以使用import java.sql*導入java.sql .再舉一個例子,使用try-with-resources語句自動關閉Connection、ResultSet和Statement類型的資源可以避免顯式連接關閉步驟并簡化代碼。
執行結果
使用JDBC API執行SQL語句可能會返回結果集、更新計數或輸出參數。
SQL查詢結果集
SQL查詢結果集對應于接口java.sql.result set的實例對象。ResultSet對象通常由Statement、PreparedStatement或CallableStatement對象的executeQuery()或execute()方法返回。ResultSet對象不僅記錄查詢集結果中的每一行數據,還記錄每一列的類型信息。ResultSet對象的主要方法如下:
移動光標的方法用于移動ResultSet對象的光標并指向不同的行,例如next()、previous()、first()、last()方法等等。
獲取列值的方法用于獲取當前行某一列的值,這些值將被轉換為指定的Java類型,如getString()、getInt()、getBoolean()、getDouble()等。
更新列值的方法用于更新當前行中某一列的值,并將這些值設置為指定的Java類型,如updateString()、updateInt()、updateBoolean()、updateDouble()等。
獲取元數據的方法用于獲取結果集的元數據,如列的數量、名稱、類型和長度,如getMetaData()、getRow()、getType()等。
關閉結果集的方法,close()方法用于關閉結果集并釋放資源。
更新計數
當使用語句或PreparedStatement對象的executeUpdate()方法執行update語句時,返回的結果是一個int值,指示更新的行數,即更新計數。更新計數可用于判斷SQL語句是否成功執行。
輸出參數
輸出參數是一個特殊參數,可用于從存儲過程或函數而不是結果集中返回值。通常CallableStatement對象的registerOutParameter()方法輸出參數的類型和位置,execute()方法執行存儲過程或函數,getXXX()方法用于獲取輸出參數的值,其中XXX表示輸出參數的數據類型,如getInt()、getString()等。
輸出參數的值可以用于邏輯判斷、統計或顯示,或者作為其他SQL語句的輸入參數。一般來說,如果輸出參數有值,則意味著執行成功;如果輸出參數沒有值,則意味著執行失敗或沒有返回值。
附件列表
詞條內容僅供參考,如果您需要解決具體問題
(尤其在法律、醫學等領域),建議您咨詢相關領域專業人士。