java連接數(shù)據(jù)庫(kù)知識(shí)點(diǎn)總結(jié)以及操作應(yīng)用
前言
項(xiàng)目很多小伙伴學(xué)習(xí)后端的時(shí)候以及學(xué)習(xí)數(shù)據(jù)庫(kù)的時(shí)候,在后端程序中,有很多的數(shù)據(jù)來(lái)自前端的傳遞或者后端本身創(chuàng)建的,這些數(shù)據(jù)都是需要的,學(xué)過(guò)數(shù)據(jù)庫(kù)的小伙伴知道,數(shù)據(jù)存放到數(shù)據(jù)庫(kù)里才容易管理以及安全、方便。那么我們就會(huì)需要將程序與數(shù)據(jù)庫(kù)進(jìn)行連接并執(zhí)行相關(guān)的操作,這是后端的一項(xiàng)經(jīng)典又必不可少的技術(shù)
一、java連接數(shù)據(jù)庫(kù)技術(shù)
Java 連接技術(shù)是 Java 程序與外部資源進(jìn)行交互的方式,可以包括連接數(shù)據(jù)庫(kù)、連接消息隊(duì)列、連接 Web 服務(wù)等等。
Java 連接技術(shù)主要有以下幾種:
1.JDBC
JDBC(Java Database Connectivity):JDBC是Java連接數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)API。它提供了一組接口和類,用于與關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行交互。通過(guò)JDBC,可以連接到各種數(shù)據(jù)庫(kù)(如MySQL、Oracle、SQL Server等),執(zhí)行SQL語(yǔ)句、事務(wù)管理和結(jié)果集處理等操作。
2.ORM
ORM框架: ORM(Object-Relational Mapping)框架允許將Java對(duì)象和關(guān)系型數(shù)據(jù)庫(kù)之間進(jìn)行映射,進(jìn)而實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作。常見的Java ORM框架包括Hibernate、MyBatis等。這些框架提供了對(duì)象與數(shù)據(jù)庫(kù)表之間的映射關(guān)系配置,簡(jiǎn)化了數(shù)據(jù)庫(kù)操作的編寫和維護(hù)工作。
3.JPA
JPA(Java Persistence API): JPA是一種基于ORM思想的Java持久化規(guī)范。它提供了一組API,用于管理和持久化Java對(duì)象到關(guān)系型數(shù)據(jù)庫(kù)。JPA具有統(tǒng)一的API和查詢語(yǔ)言,可以與多種底層ORM實(shí)現(xiàn)(如Hibernate、EclipseLink等)集成。
4.JPA
數(shù)據(jù)庫(kù)連接池: 數(shù)據(jù)庫(kù)連接池是一種管理數(shù)據(jù)庫(kù)連接的技術(shù),它通過(guò)創(chuàng)建和維護(hù)一定數(shù)量的數(shù)據(jù)庫(kù)連接對(duì)象,實(shí)現(xiàn)連接的復(fù)用和高效管理。常見的Java數(shù)據(jù)庫(kù)連接池有Apache Commons DBCP、C3P0和HikariCP等。
5.NoSQL數(shù)據(jù)庫(kù)驅(qū)動(dòng):
NoSQL數(shù)據(jù)庫(kù)驅(qū)動(dòng): 除了關(guān)系型數(shù)據(jù)庫(kù),Java也支持連接和操作各種NoSQL數(shù)據(jù)庫(kù),如MongoDB、Redis、Elasticsearch等。這些數(shù)據(jù)庫(kù)通常有自己的原生Java驅(qū)動(dòng)或客戶端庫(kù),用于在Java應(yīng)用程序中進(jìn)行連接和數(shù)據(jù)交互。
二、jdbc
JDBC是Java語(yǔ)言中提供的一組API,它提供了一種與關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行交互的標(biāo)準(zhǔn)方式。利用JDBC可以讓Java程序連接到各種不同的關(guān)系型數(shù)據(jù)庫(kù)(例如Oracle、MySQL、Microsoft SQL Server等),執(zhí)行SQL語(yǔ)句以及檢索和更新數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
JDBC API包含兩部分:JDBC API和JDBC驅(qū)動(dòng)程序。
JDBC API提供了訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)方式,其中包含連接數(shù)據(jù)庫(kù)所需的類、接口和標(biāo)準(zhǔn)SQL類型。JDBC驅(qū)動(dòng)程序是一個(gè)具體的實(shí)現(xiàn),不同類型的關(guān)系型數(shù)據(jù)庫(kù)需要不同的驅(qū)動(dòng)程序?qū)崿F(xiàn)。
在使用JDBC時(shí),我們需要先加載對(duì)應(yīng)的JDBC驅(qū)動(dòng)程序,然后通過(guò)JDBC API提供的接口和類建立數(shù)據(jù)庫(kù)連接,最后通過(guò)執(zhí)行SQL語(yǔ)句來(lái)操作數(shù)據(jù)庫(kù)中的數(shù)據(jù),執(zhí)行結(jié)束后需關(guān)閉連接。下面是一個(gè)簡(jiǎn)單的Java程序示例,展示如何使用JDBC連接數(shù)據(jù)庫(kù)并執(zhí)行SQL語(yǔ)句:
import java.sql.*; public class JDBCDemo { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 加載MySQL驅(qū)動(dòng)程序 Class.forName("com.mysql.jdbc.Driver"); // 獲取數(shù)據(jù)庫(kù)連接 String url = "jdbc:mysql://localhost:3306/test?useSSL=false"; String user = "root"; String password = "123456"; conn = DriverManager.getConnection(url, user, password); /** 準(zhǔn)備寫入 SQL */ // 創(chuàng)建Statement對(duì)象 stmt = conn.createStatement(); // 執(zhí)行SQL查詢語(yǔ)句 rs = stmt.executeQuery("SELECT * FROM student"); // 處理查詢結(jié)果 while (rs.next()) { System.out.println(rs.getString("Studentname")); //獲取Studentname這一列的數(shù)據(jù) } } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { // 關(guān)閉ResultSet、Statement和Connection try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
上面的示例程序中,我們首先加載了MySQL數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng),然后通過(guò)DriverManager獲取數(shù)據(jù)庫(kù)連接,創(chuàng)建Statement對(duì)象并執(zhí)行SQL查詢語(yǔ)句,最后處理查詢結(jié)果并關(guān)閉所持有的JDBC資源。
三、連接步驟
使用 JDBC 連接數(shù)據(jù)庫(kù)需要分為以下幾個(gè)步驟:
1. 加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)
在連接數(shù)據(jù)庫(kù)之前,需要先加載相應(yīng)的 JDBC 驅(qū)動(dòng)程序。不同類型的數(shù)據(jù)庫(kù)需要使用不同的驅(qū)動(dòng)程序,例如 MySQL 使用的驅(qū)動(dòng)程序是 com.mysql.jdbc.Driver,Oracle 使用的是 oracle.jdbc.driver.OracleDriver,如果忘記加載驅(qū)動(dòng)程序,會(huì)導(dǎo)致連接數(shù)據(jù)庫(kù)失敗。
加載驅(qū)動(dòng)程序可以通過(guò) Class.forName() 方法實(shí)現(xiàn),例如:
Class.forName("com.mysql.jdbc.Driver");
2. 創(chuàng)建數(shù)據(jù)庫(kù)連接
在加載完成驅(qū)動(dòng)程序之后,就可以使用 DriverManager.getConnection() 方法來(lái)創(chuàng)建連接對(duì)象。該方法需要傳遞一個(gè)包含連接信息的 URL(Uniform Resource Locator)、用戶名和密碼,例如:
String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "root"; String password = "mypassword"; Connection conn = DriverManager.getConnection(url, user, password);
其中,“jdbc:mysql://” 表示連接的數(shù)據(jù)庫(kù)類型是 MySQL,“localhost” 表示連接到本地主機(jī),“3306” 表示連接到 MySQL 的端口號(hào),“mydatabase” 表示要連接的數(shù)據(jù)庫(kù)名稱,“root” 和 “mypassword” 分別表示連接用戶名和密碼。
3. 創(chuàng)建 Statement 或 PreparedStatement 對(duì)象
連接數(shù)據(jù)庫(kù)之后,可以使用 Statement 或 PreparedStatement 對(duì)象執(zhí)行 SQL 語(yǔ)句。其中,Statement 對(duì)象用于執(zhí)行靜態(tài) SQL 語(yǔ)句或者預(yù)編譯的 SQL 語(yǔ)句,PreparedStatement 對(duì)象用于執(zhí)行帶參數(shù)的 SQL 語(yǔ)句。
創(chuàng)建 Statement 或 PreparedStatement 對(duì)象可以通過(guò) Connection 的 createStatement() 或 prepareStatement() 方法實(shí)現(xiàn),例如:
// 創(chuàng)建 Statement 對(duì)象 Statement stmt = conn.createStatement(); // 創(chuàng)建 PreparedStatement 對(duì)象 PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM user WHERE username = ?");
4. 執(zhí)行 SQL 語(yǔ)句
創(chuàng)建好 Statement 或 PreparedStatement 對(duì)象之后,就可以使用 execute()、executeQuery() 或 executeUpdate() 方法來(lái)執(zhí)行 SQL 語(yǔ)句了。其中,execute() 用于執(zhí)行任意一種 SQL 語(yǔ)句,executeQuery() 用于執(zhí)行 SELECT 語(yǔ)句并返回結(jié)果集,executeUpdate() 用于執(zhí)行 INSERT、UPDATE 和 DELETE 語(yǔ)句并返回受影響的記錄數(shù)。
// 執(zhí)行查詢語(yǔ)句,返回結(jié)果集 ResultSet rs = stmt.executeQuery("SELECT * FROM user"); // 執(zhí)行插入語(yǔ)句,返回受影響的記錄數(shù) int count = stmt.executeUpdate("INSERT INTO user (username, password) VALUES ('admin', '123456')");
5. 處理結(jié)果集
執(zhí)行 SQL 語(yǔ)句之后,需要將結(jié)果集通過(guò) ResultSet 對(duì)象進(jìn)行獲取。ResultSet 對(duì)象的使用方法和 Statement 或 PreparedStatement 對(duì)象類似,例如可以使用 next() 方法將當(dāng)前記錄移動(dòng)到下一條記錄,使用 getXXX() 獲取記錄中某個(gè)列的值,例如:
while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); }
6. 關(guān)閉資源
最后,在不再使用數(shù)據(jù)庫(kù)連接、Statement、PreparedStatement 或 ResultSet 對(duì)象時(shí),需要將它們及時(shí)關(guān)閉,釋放對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的連接,以減少系統(tǒng)負(fù)擔(dān)。例如:
rs.close(); stmt.close(); conn.close();
以上就是使用 JDBC 連接到數(shù)據(jù)庫(kù)并執(zhí)行 SQL 語(yǔ)句的基本步驟。需要注意的是,使用 JDBC 連接數(shù)據(jù)庫(kù)需要加上異常處理,防止在執(zhí)行過(guò)程中出現(xiàn)異常導(dǎo)致程序崩潰。
總結(jié)
到此這篇關(guān)于java連接數(shù)據(jù)庫(kù)知識(shí)點(diǎn)總結(jié)以及操作應(yīng)用的文章就介紹到這了,更多相關(guān)java連接數(shù)據(jù)庫(kù)操作應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Spring?Boot+gRPC構(gòu)建微服務(wù)并部署的案例詳解
這篇文章主要介紹了使用Spring?Boot+gRPC構(gòu)建微服務(wù)并部署,Spring Cloud僅僅是一個(gè)開發(fā)框架,沒有實(shí)現(xiàn)微服務(wù)所必須的服務(wù)調(diào)度、資源分配等功能,這些需求要借助Kubernetes等平臺(tái)來(lái)完成,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-06-06Feign利用自定義注解實(shí)現(xiàn)路徑轉(zhuǎn)義詳解
這篇文章主要講解一下如何通過(guò)注解實(shí)現(xiàn)對(duì)路由中的路徑進(jìn)行自定義編碼,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的幫助,需要的可以參考一下2022-06-06Java之Spring注解配置bean實(shí)例代碼解析
這篇文章主要介紹了Java之Spring注解配置bean實(shí)例代碼解析,具有一定參考價(jià)值,文中還有有關(guān)Spring學(xué)習(xí)的資料下載鏈接及相關(guān)內(nèi)容推薦,需要的朋友可以了解下。2017-09-09java實(shí)現(xiàn)解析二進(jìn)制文件的方法(字符串、圖片)
本篇文章主要介紹了java實(shí)現(xiàn)解析二進(jìn)制文件的方法(字符串、圖片),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02基于spring AOP @Around @Before @After的區(qū)別說(shuō)明
這篇文章主要介紹了基于spring AOP @Around @Before @After的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02RabbitMQ 3.9.7 鏡像模式集群與Springboot 2.5.5 整合
今天我們來(lái)聊聊 RabbitMQ 3.9.7 鏡像模式集群與Springboot 2.5.5 整合,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-10-10詳解spring boot jpa整合QueryDSL來(lái)簡(jiǎn)化復(fù)雜操作
這篇文章主要介紹了詳解spring boot jpa整合QueryDSL來(lái)簡(jiǎn)化復(fù)雜操作,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04