Java數據庫操作指南:快速上手JDBC【學術會議-2025年數字化教育與信息技術(DEIT 2025】

大會官網:www.ic-deit.org?

前言

在現代企業應用中,數據庫是數據存儲和管理的重要組成部分。Java作為一種廣泛使用的編程語言,提供了多種方式與數據庫進行交互。本文將介紹 JDBC(Java Database Connectivity),它是Java語言與數據庫之間的橋梁,幫助開發者通過Java程序與數據庫進行連接、查詢、插入、更新和刪除數據。

什么是JDBC?

JDBC(Java數據庫連接)是Java提供的一套API,用于從Java程序中訪問和操作關系型數據庫。通過JDBC,Java程序能夠執行SQL語句、管理數據庫連接,并處理結果集。JDBC是Java平臺的標準一部分,支持多種數據庫管理系統(DBMS),如MySQL、Oracle、PostgreSQL、SQL Server等。

JDBC的核心組件

  1. DriverManager
    管理數據庫驅動程序,負責選擇正確的驅動程序并與數據庫建立連接。

  2. Connection
    代表數據庫連接,JDBC的核心對象之一。通過Connection可以執行SQL語句、獲取Statement、PreparedStatement等對象。

  3. Statement
    用于執行SQL語句,分為以下幾類:

    • Statement: 用于執行簡單的SQL查詢。
    • PreparedStatement: 用于執行預編譯的SQL查詢,避免SQL注入問題,并提高性能。
    • CallableStatement: 用于執行存儲過程。
  4. ResultSet
    執行查詢后返回的結果集。通過ResultSet對象,可以訪問查詢的結果數據。

配置JDBC

在使用JDBC時,需要確保以下幾個步驟:

  1. 加載數據庫驅動:首先要加載數據庫的JDBC驅動,通常使用Class.forName()來動態加載。
  2. 建立數據庫連接:使用DriverManager.getConnection()方法建立與數據庫的連接。
  3. 執行SQL語句:通過StatementPreparedStatement對象執行SQL語句。
  4. 處理結果集:使用ResultSet對象讀取查詢的結果數據。
  5. 關閉連接:最后,關閉數據庫連接以釋放資源。

實踐示例:JDBC數據庫操作

1. 連接數據庫

首先,我們需要添加數據庫的JDBC驅動包。如果使用的是MySQL,可以下載并添加 MySQL JDBC 驅動(mysql-connector-java)。

然后,創建一個簡單的Java程序來連接數據庫。

import java.sql.*;public class JDBCExample {public static void main(String[] args) {// 數據庫連接信息String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";// 連接對象Connection connection = null;try {// 1. 加載數據庫驅動(對于MySQL數據庫)Class.forName("com.mysql.cj.jdbc.Driver");// 2. 獲取數據庫連接connection = DriverManager.getConnection(url, user, password);System.out.println("連接成功!");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 關閉連接try {if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}}
}

這段代碼展示了如何加載MySQL驅動、建立數據庫連接并進行簡單的連接驗證。

2. 執行查詢操作

接下來,我們通過JDBC查詢數據庫,獲取并輸出查詢結果。

public class JDBCQueryExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";String query = "SELECT * FROM users";  // 假設有一個名為users的表Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {// 1. 加載數據庫驅動Class.forName("com.mysql.cj.jdbc.Driver");// 2. 獲取數據庫連接connection = DriverManager.getConnection(url, user, password);// 3. 創建Statement對象statement = connection.createStatement();// 4. 執行SQL查詢resultSet = statement.executeQuery(query);// 5. 處理結果集while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");String email = resultSet.getString("email");System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);}} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 關閉資源try {if (resultSet != null) resultSet.close();if (statement != null) statement.close();if (connection != null) connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

此代碼通過executeQuery()方法執行一個SELECT語句,返回一個ResultSet對象,并通過next()方法遍歷結果。

3. 插入數據

使用PreparedStatement進行數據插入,可以提高性能并避免SQL注入。

public class JDBCInsertExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";String insertQuery = "INSERT INTO users (name, email) VALUES (?, ?)";Connection connection = null;PreparedStatement preparedStatement = null;try {// 1. 加載數據庫驅動Class.forName("com.mysql.cj.jdbc.Driver");// 2. 獲取數據庫連接connection = DriverManager.getConnection(url, user, password);// 3. 創建PreparedStatement對象preparedStatement = connection.prepareStatement(insertQuery);preparedStatement.setString(1, "John Doe");preparedStatement.setString(2, "john.doe@example.com");// 4. 執行更新操作(插入數據)int rowsAffected = preparedStatement.executeUpdate();System.out.println("插入了 " + rowsAffected + " 行數據");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 關閉資源try {if (preparedStatement != null) preparedStatement.close();if (connection != null) connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

PreparedStatement允許我們使用占位符?,在插入數據時動態綁定參數,避免SQL注入問題。

4. 更新數據

通過PreparedStatement更新數據:

public class JDBCUpdateExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";String updateQuery = "UPDATE users SET email = ? WHERE name = ?";Connection connection = null;PreparedStatement preparedStatement = null;try {// 1. 加載數據庫驅動Class.forName("com.mysql.cj.jdbc.Driver");// 2. 獲取數據庫連接connection = DriverManager.getConnection(url, user, password);// 3. 創建PreparedStatement對象preparedStatement = connection.prepareStatement(updateQuery);preparedStatement.setString(1, "new.email@example.com");preparedStatement.setString(2, "John Doe");// 4. 執行更新操作int rowsAffected = preparedStatement.executeUpdate();System.out.println("更新了 " + rowsAffected + " 行數據");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 關閉資源try {if (preparedStatement != null) preparedStatement.close();if (connection != null) connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

5. 刪除數據

通過PreparedStatement刪除數據:

public class JDBCDeleteExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";String deleteQuery = "DELETE FROM users WHERE name = ?";Connection connection = null;PreparedStatement preparedStatement = null;try {// 1. 加載數據庫驅動Class.forName("com.mysql.cj.jdbc.Driver");// 2. 獲取數據庫連接connection = DriverManager.getConnection(url, user, password);// 3. 創建PreparedStatement對象preparedStatement = connection.prepareStatement(deleteQuery);preparedStatement.setString(1, "John Doe");// 4. 執行刪除操作int rowsAffected = preparedStatement.executeUpdate();System.out.println("刪除了 " + rowsAffected + " 行數據");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 關閉資源try {if (preparedStatement != null) preparedStatement.close();if (connection != null) connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}
擴展:

具體來說,setString(int parameterIndex, String x) 方法用于將指定位置的占位符(?)替換成指定的字符串值。

PreparedStatement 的工作原理

PreparedStatement 是一個接口,用于執行預編譯的 SQL 查詢。在 SQL 查詢中,通常使用 ? 來表示占位符,表示參數將在運行時被動態傳入,而不是在 SQL 查詢字符串中直接硬編碼。

例如,假設你要執行一個插入操作,SQL 語句可能是這樣的:

INSERT INTO users (name, email) VALUES (?, ?);

這個 SQL 語句有兩個 ? 占位符,表示你將動態地插入兩個值(例如,nameemail)。

setString(int parameterIndex, String x) 詳解

  • parameterIndex:這個參數表示要替換的占位符的位置(從1開始),也就是你想要設置哪個位置的參數。
  • x:這是你想要設置的值,類型必須與占位符的類型匹配。在這種情況下,我們使用 setString,意味著占位符將會被一個字符串值替換。

preparedStatement.setString(1, "John Doe");
?

  • 1:這是第一個 ? 占位符的位置(從1開始計數)。表示要將 ? 的位置替換為 John Doe
  • "John Doe":這是你要插入的實際值(字符串 "John Doe")。這個值會替代 SQL 語句中的第一個占位符 ?

等價于:

INSERT INTO users (name, email) VALUES ('John Doe', ?);

preparedStatement.setString(2, "john.doe@example.com");
  • 2:這是第二個 ? 占位符的位置,表示要將 SQL 中的第二個 ? 替換為 john.doe@example.com
  • "john.doe@example.com":這是你要插入的實際值(字符串 "john.doe@example.com")。這個值會替代 SQL 語句中的第二個占位符 ?

等價于:

INSERT INTO users (name, email) VALUES ('John Doe', 'john.doe@example.com');

結合完整 SQL 語句

將這兩行代碼與 SQL 語句結合,最終執行的 SQL 語句就是:

INSERT INTO users (name, email) VALUES ('John Doe', 'john.doe@example.com');

這兩行代碼的作用是:

  • 第一行將 "John Doe" 作為第一個參數(name)傳遞給 SQL 查詢。
  • 第二行將 "john.doe@example.com" 作為第二個參數(email)傳遞給 SQL 查詢。

使用 PreparedStatement 設置參數有兩個主要優點:

  1. 防止 SQL 注入攻擊:通過占位符傳遞參數,避免直接將數據嵌入 SQL 語句中,減少了惡意 SQL 注入的風險。
  2. 提高性能:對于重復執行相同 SQL 查詢的情況,JDBC 可以重用編譯后的 SQL 執行計劃,避免了每次都需要重新解析 SQL。

總結

本文展示了如何在Java中使用JDBC進行簡單的數據庫操作,包括連接數據庫查詢插入更新刪除等基本操作。JDBC為Java應用程序提供了強大的數據庫交互功能,但也需要注意資源管理(如連接的關閉)以及SQL注入等安全問題。希望本文能夠幫助大家快速上手并實現Java與數據庫的交互。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67299.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67299.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67299.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

神經網絡的通俗介紹

人工神經網絡,是一種模仿人類大腦工作原理的數學模型。人類的大腦是由無數的小“工作站”組成的,每個工作站叫做“神經元”。這些神經元通過“電線”互相連接,負責接收、處理和傳遞信息。 一、人類大腦神經網絡 人類大腦的神經網絡大概長這…

FLTK - FLTK1.4.1 - demo - animgifimage-play

文章目錄 FLTK - FLTK1.4.1 - demo - animgifimage-play概述筆記END FLTK - FLTK1.4.1 - demo - animgifimage-play 概述 看的官方demo越多,在每個新demo中能看到的新增知識點越少。這是好事。 不可能一次將細節都記住,只要知道每個官方demo能干啥&…

OpenEuler學習筆記(八):安裝OpenEuler

在VMware Workstation中安裝OpenEuler 準備工作 下載并安裝VMware Workstation虛擬機軟件。前往OpenEuler官網下載OpenEuler系統鏡像文件。 創建虛擬機 打開VMware Workstation,點擊“創建新的虛擬機”,選擇“自定義”,點擊“下一步”。選擇…

Rust:高性能與安全并行的編程語言

引言 在現代編程世界里,開發者面臨的最大挑戰之一就是如何平衡性能與安全性。在許多情況下,C/C這樣的系統級編程語言雖然性能強大,但其內存管理的復雜性導致了各種安全漏洞。為了解決這些問題,Rust 作為一種新的系統級編程語言進入…

Leetcode::119. 楊輝三角 II

119. 楊輝三角 II 已解答 簡單 相關標簽 相關企業 給定一個非負索引 rowIndex,返回「楊輝三角」的第 rowIndex 行。 在「楊輝三角」中,每個數是它左上方和右上方的數的和。 示例 1: 輸入: rowIndex 3 輸出: [1,3,3,1]示例 2: 輸入: rowIndex 0…

讓Android adb支持互聯網調試脫離局域網

某些特殊場景下由于不方便,手機不在身邊,但需要進行adb調試。 首先可以先開啟adb的無線調試模式,我使用的是第二種方式。 在Android手機上安裝一個終端模擬器,并賦予root權限,隨后執行: setprop service.…

PHP中的獲取器和修改器:探索數據訪問的新維度

在PHP開發中,操作數據是開發人員最常見的任務之一。為了使數據的訪問和修改更加便捷和安全,PHP提供了獲取器和修改器這兩個強大的特性。本文將探索獲取器和修改器的作用和用法,并且通過具體的代碼示例來幫助讀者更好地理解和應用這兩個特性。…

Dest1ny漏洞庫:用友 U8-CRM 系統 ajaxgetborrowdata.php 存在 SQL 注入漏洞

用友U8-CRM系統ajaxgetborrowdata.php存在SQL注入漏洞,文件多個方法存在SQL注入漏洞,未經身份驗證的攻擊者通過漏洞執行任意SQL語句,調用xp_cmdshell寫入后門文件,執行任意代碼,從而獲取到服務器權限。 hunter app.n…

能說說MyBatis的工作原理嗎?

大家好,我是鋒哥。今天分享關于【Redis為什么這么快?】面試題。希望對大家有幫助; 能說說MyBatis的工作原理嗎? MyBatis 是一款流行的持久層框架,它通過簡化數據庫操作,幫助開發者更高效地與數據庫進行交互。MyBatis…

DeepSeek崛起:中國AI新星如何撼動全球資本市場格局

引言 近期,中國人工智能實驗室DeepSeek發布的兩款開源模型——DeepSeek V3和DeepSeek R1——以其優異的性能和低廉的成本迅速爆火,引發了全球資本市場的震動,尤其對美國資本市場產生了顯著影響。DeepSeek R1更是能夠在數學、代碼和推理任務上…

0.91英寸OLED顯示屏一種具有小尺寸、高分辨率、低功耗特性的顯示器件

0.91英寸OLED顯示屏是一種具有小尺寸、高分辨率、低功耗特性的顯示器件。以下是對0.91英寸OLED顯示屏的詳細介紹: 一、基本參數 尺寸:0.91英寸分辨率:通常為128x32像素,意味著顯示屏上有128列和32行的像素點,總共409…

將5分鐘安裝Thingsboard 腳本升級到 3.9

稍微花了一點時間,將5分鐘安裝Thingsboard 腳本升級到最新版本 3.9。 [rootlab5 work]# cat one-thingsboard.shell echo "test on RHEL 8.10 " source /work/java/install-java.shell source /work/thingsboard/thingsboard-rpm.shell source /work/po…

使用Python Dotenv庫管理環境變量

使用Python Dotenv庫管理環境變量 在開發Python應用程序時,管理配置信息(如API密鑰、數據庫連接字符串等)是一個常見的需求。為了確保安全性和靈活性,通常不建議將這些敏感信息硬編碼在代碼中。這時,dotenv庫就派上了…

算法刷題Day30

題目鏈接 描述 解題思路 考點:動態規劃 dp[i][j]表示當前坐標的最小路徑和dp初始化狀態轉移: dp[i][j] matrix[i][j] min(dp[i-1][j],dp[i][j-1]) 比較正上方和正左方的路徑和哪個小。取小的那條路 代碼 import copy class Solution:def minPathS…

大數據Hadoop入門2

目錄 第三部分(Hadoop MapReduce和Hadoop YARN) 1.課程內容-大綱-學習目標 2.理解先分再合、分而治之的思想 3.hadoop團隊針對MapReduce的設計構思 4.Hadoop MapReduce介紹、階級劃分和進程組成 5.Hadoop MapReduce官方示例-圓周率PI評估 6.Hadoo…

基于ESP8266的多功能環境監測與反饋系統開發指南

項目概述 本系統集成了物聯網開發板、高精度時鐘模塊、環境傳感器和可視化顯示模塊,構建了一個智能環境監測與反饋裝置。通過ESP8266 NodeMCU作為核心控制器,結合DS3231實時時鐘、DHT11溫濕度傳感器、光敏電阻和OLED顯示屏,實現了環境參數的…

Spring Boot Actuator 集成 Micrometer(官網文檔解讀)

目錄 概述 實現 Observation 可觀測性 Observation 功能核心類 ObservationPredicate GlobalObservationConvention ObservationFilter ObservationHandler ObservationRegistryCustomizer Observation 相關注解 多線程處理機制 配置上下文傳播 常用標簽配置 Open…

QModbusTCPClient 服務器斷開引起的程序崩潰

最近使用QModbusTCPClient 與一套設備通信,有一個QTimer頻繁的通過讀取設備寄存器。程序運行良好,但是有個問題:正常進行中設備斷電了,整個程序都會崩潰。解決過程如下: 1.失敗方案一 在QModbusTCPClient的errorOccu…

vue3底層原理和性能優化

Vue 3 在底層原理和性能優化方面做了許多改進,以下是一些主要的優化點和原理: 1. 虛擬 DOM 的改進 靜態樹提升:Vue 3 能夠檢測到靜態組件(即不依賴響應式數據的組件)并將其提升到渲染函數之外,從而減少不…

開發環境搭建-3:配置 JavaScript 開發環境 (fnm+ nodejs + pnpm + nrm)

在 WSL 環境中配置:WSL2 (2.3.26.0) Oracle Linux 8.7 官方鏡像 node 官網:https://nodejs.org/zh-cn/download 點擊【下載】,選擇想要的 node 版本、操作系統、node 版本管理器、npm包管理器 根據下面代碼提示依次執行對應代碼即可 基本概…