一文快速回顧 Java 操作資料庫的方式-JDBC

来源:https://www.cnblogs.com/god23bin/archive/2023/03/12/a_quick_review_of_the_article_about_jdbc.html
-Advertisement-
Play Games

資料庫的重要性不言而喻,不管是什麼系統,什麼應用軟體,也不管它們是 Windows 上的應用程式,還是 Web 應用程式,存儲(持久化)和查詢(檢索)數據都是核心的功能。 大家學習資料庫時,比如 MySQL 這個資料庫管理系統,都是在 CLI(Command Line Interface)上操作數據... ...


前言

資料庫的重要性不言而喻,不管是什麼系統,什麼應用軟體,也不管它們是 Windows 上的應用程式,還是 Web 應用程式,存儲(持久化)和查詢(檢索)數據都是核心的功能。

大家學習資料庫時,比如 MySQL 這個資料庫管理系統,都是在 CLI(Command Line Interface)上操作資料庫的,現在,我們看看,在 Java Web 中,我們如何使用 Java 去操作資料庫。

JDBC

JDBC(Java Data Base Connectivity)是 Java 操作資料庫的一種規範,也是一種 API(與資料庫系統進行通信的標準的 API),更是一門技術。

JDBC 是由一組用 Java 編寫的類和介面組成,對資料庫的操作提供了基本的方法。但是,對於資料庫細節的操作,那就是由資料庫的廠商實現的。使用 JDBC 操作資料庫,需要資料庫廠商提供的資料庫驅動程式的支持。

那什麼是資料庫驅動程式呢?這個驅動(driver)可以理解成一種可以讓資料庫和 Java 彼此進行互動的程式。

簡單來講,JDBC 提供了一種 API 的規範,告訴各大資料庫廠商按這種規範來實現這些 API 具體的實現代碼。可以從兩個角色的角度來說這個 JDBC。從咱們開發人員的角度來說,JDBC 為我們開發人員提供了統一的操作資料庫的 API,不用管這些 API 的具體實現,專註於 API 的調用;從資料庫廠商的角度來說,JDBC 為他們提供了一套標準的模型介面,都按這個介面去做自己的實現。

如何使用 JDBC?

JDBC 的使用主要有如下幾個步驟:

  1. 註冊資料庫驅動程式(database driver program)到 JDBC 的驅動管理器中。

在連接資料庫之前,需要將資料庫廠商提供的資料庫驅動類註冊到 JDBC 的驅動管理器中,一般是把驅動類載入到 JVM 實現的。

Class.forName("com.mysql.jdbc.Driver");
  1. 構建資料庫連接的 URL。

要與資料庫建立連接,那麼就需要構建資料庫連接的 URL,這個 URL 由資料庫廠商指定,一般符合一種基本格式,即 JDBC協議+IP地址或功能變數名稱+埠+資料庫名稱。MySQL 的 URL 是 jdbc:mysql://localhost:3306/dbname

  1. 獲取連接對象(Connection 對象)。
String url = "jdbc:mysql://localhost:3306/dbname";
String username = "root";
String password = "123456";
// Connection 對象的獲取需要藉助 DriverManager 對象
Connection conn = DriverManager.getConnection(url, username, password);
  1. 進行資料庫操作。

編寫 SQL,然後獲取 PreparedStatement 對象,對 SQL 語句進行執行。SQL 語句的參數是可以使用占位符 “?” 代替,再通過 PreparedStatement 對象對 SQL 語句中的占位符進行賦值。

Statment 這個單詞的意思在這裡指的就是 SQL 語句。

// 編寫SQL
String sql = "INSERT INTO tb_game(name, price, platform) values(?, ?, ?)";
// 獲取 PreparedStatement 對象
PreparedStatement ps = conn.preparedStatement(sql);
// 給占位符賦值
ps.setString(1, "NBA2K");
ps.setDouble(2, 198.0);
ps.setString(3, "Windows");
// 執行 SQL,將這條數據寫入資料庫,返回影響的行數
int row = ps.executeUpdate();

使用 PreparedStatement 對象對 SQL 語句的占位符參數賦值,其參數的下標是從 1 開始的。

  1. 關閉連接
conn.close();

CRUD

新增操作

新增操作,就是上面的插入操作,請看上面。

查詢操作

ResultSet

使用 JDBC 查詢數據,與插入數據的操作流程基本一樣,但是執行查詢操作後需要通過一個對象來接收查詢的結果,這個對象就是 ResultSet (結果集)。

ResultSet 是 JDBC API 中封裝的對象,從數據表中查到的所有記錄都會放在這個集合中。ResultSet 中維護著一個 cursor(游標)來指向當前的數據行(數據記錄),初始化的時候,這個游標指向第一行的前一行,可以通過 next() 方法來移動游標,讓游標指向下一行。

調用這個 next() 它返回的是一個布爾值,為 true 說明 ResultSet 中還有下一行的數據,為 false 說明沒有,所以可以結合 while 迴圈使用這個方法來遍歷整個 ResultSet。

// 由於一開始的游標在第一行的前一行,所以執行 next() 後,游標就指向第一行的數據了
while (resultSet.next()) {
    // 處理結果集中每一行的數據
}

獲取到 ResultSet 對象後,移動了游標指定了數據行,然後通過 ResultSet 對象提供的一系列 getXxxx() 方法來獲取當前行的數據,比如 resultSet.getInt("price") 獲取當前行中欄位名為 price 的數據。

預設的 ResultSet 是不可更新的,同時它的游標只能一步一步 next 下去,只能走一遍,不能回到上一行的。說了預設,那說明是可以設置的,通過如下代碼進行設置:

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
// rs 是可以滾動的,也就是游標走到最後又會回到開頭繼續走,並且它的內容是可以被改變的

查詢

找到價格大於50塊錢的所有游戲:

String sql = "SELECT id, name, price FROM tb_game WHERE price > ?";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setDouble(1, 50);
// 執行查詢
ResultSet rs = ps.executeQuery(sql);
List<Game> gameList = new ArrayList<>();
// 遍歷結果集
while (rs.next()) {
	Game game = new Game();
    // 獲取當前行中欄位名為 id 的數據,並賦值到 game 對象中
    game.setId(rs.getInt("id"));
    game.setName(rs.getString("name"));
    game.setPrice(rs.getDouble("price"));
    gameList.add(game);
}
System.out.println(gameList);

修改(更新)操作

修改(更新)數據的操作,也是和插入數據的操作是類似的。

更新 ID 為 3 的數據記錄,修改其價格為 298 塊錢。

String sql = "UPDATE tb_game SET price = ? WHERE id = ?";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setDouble(1, 298);
ps.setInt(2, 3);
int row = ps.executeUpdate();

刪除操作

同理。

String sql = "DELETE FROM tb_game WHERE id = ?";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setInt(1, 1);
int row = ps.executeUpdate();

分頁查詢

在 Java Web 中數據量非常大的情況下,是不利於將所有數據都展示到一個頁面中的,查看不方便,又占用系統資源。此時就需要對數據進行分頁查詢,同時,以後的工作中,可以說大部分的業務場景都會涉及到分頁查詢。

在 MySQL 中,分頁可以通過其自身的 LIMIT 關鍵字來實現:

SELECT *
FROM tb_game
WHERE price > 50
ORDER BY price DESC
LIMIT 0, 10; // 從表中下標0開始(第一行的下標為0),限制返回10條記錄

目前分頁涉及到這樣的兩個參數:當前頁碼頁面大小

涉及的 SQL 語句:SELECT * FROM tb_game WHERE price > 50 ORDER BY price DESC LIMIT 當前頁碼, 頁面大小

// 分頁參數
int currentPage = 1, pageSize = 10;
// 分頁 SQL
String sql = "SELECT * FROM tb_game WHERE price > 50 ORDER BY price DESC LIMIT ?, ?";
PreparedStatement ps = conn.preparedStatement(sql);
// 賦值
ps.setInt(1, (page - 1) * pageSize);
ps.setInt(2, pageSize);
ResultSet rs = ps.executeQuery();

與此同時,還需要計算獲取的數據的總記錄數,用於計算分頁的總頁數,便於前端傳遞是要哪一頁的數據給後端。

int count = 0;
String sql = "SELECT COUNT(*) FROM tb_game WHERE price > 50";
PreparedStatement ps = conn.preparedStatement(sql);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
    // 獲取總記錄數,getInt(1) 是獲取第一列的數據
    count = rs.getInt(1);
}

總結

目前在 Java 中通過 JDBC 來操作資料庫,就有幾個固定的步驟,先載入資料庫驅動程式,接著獲取資料庫的連接,有了這個連接後,才能進行 CRUD 的操作,操作後也可以獲取操作的結果,最後關閉這些資源,比如資料庫連接。

不過,在日常的開發中,基本不會用到原生的 JDBC 來操作資料庫,一般我們有多種選擇,可以使用 JdbcTemplate、Hibernate、MyBatis、JPA(Java Persistence API,Java 持久化 API)或者是其他任意的持久化框架。

最後的最後

由本人水平所限,難免有錯誤以及不足之處, 屏幕前的靚仔靚女們 如有發現,懇請指出!

最後,謝謝你看到這裡,謝謝你認真對待我的努力,希望這篇博客對你有所幫助!

你輕輕地點了個贊,那將在我的心裡世界增添一顆明亮而耀眼的星!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 依賴管理和自動配置 1.依賴管理 1.1什麼是依賴管理 spring-boot-starter-parent 中還有父項目,聲明瞭開發中常用的依賴的版本號 並且進行自動版本仲裁,即如果程式員沒有指定某個依賴jar的版本,則以父版本指定的版本為準 1.2修改自動仲裁/預設版本號 比如我們要將Sprin ...
  • # Create test matrix(造數據) set.seed(6) test = matrix(rnorm(200), 20, 10) test[1:10, seq(1, 10, 2)] = test[1:10, seq(1, 10, 2)] + 3 test[11:20, seq(2, 1 ...
  • 一、算術運算符 運算符描述 + 相加 - 相減 * 相乘 / 相除 % 求餘 代碼示例: 1 package main 2 ​ 3 import "fmt" 4 ​ 5 func main() { 6 // 算術運算符 7 a := 5 8 b := 2 9 ​ 10 fmt.Printf("a+b ...
  • SpringBoot基本介紹 1.SpringBoot是什麼? 官網地址:https://spring.io/projects/spring-boot 學習文檔:https://docs.spring.io/spring-boot/docs/2.7.10-SNAPSHOT/reference 線上A ...
  • @ 前言 🍊緣由 介面文檔對接爽,整理起來真費腦 對於整理API文檔,本狗秉承偷懶為上的原則,想找一種在IDEA中直接生成文檔的方法。Apifox Helper絕絕子,只需要在IDEA中下載插件,無腦配置後,文檔自動生成到Apifox,美完美解決。並且顏值及方便程度絕比Swagger和postma ...
  • 說明 使用 QCustomPlot 繪圖庫輔助開發時整理的學習筆記。 1. 庫簡介 QCustomPlot 是一個用於科學繪圖的 QT 第三方庫,可以用於常見的二維圖像繪製,比如函數曲線、參數方程曲線、熱力圖、柱狀圖、箱線圖、極坐標繪圖等。該庫由德國人 Emanuel Eichhammer 開發,經 ...
  • 今天看到個有趣的網站,給大家分享一下。 該網站的功能很神奇,可以實現編程語言的轉化。感覺在一些場景之下還是有點作用的,比如你原來跟我一樣是做Java的,因為工作需要突然轉Go。這個時候用你Java的經驗 + 這個工具,或許可以起到一定的幫助作用。 工具的使用也很簡單,只需要在左側黏貼你想轉換的原始代 ...
  • 一、初識爬蟲,requests使用 requests介紹: Request支持HTTP連接保持和連接池,支持使用cookie保持會話,支持文件上傳,支持自動響應內容的編碼,支持國際化的URL和POST數據自動編碼。requests會自動實現持久連接keep-alive # 導入模塊 import r ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...