Java的數據庫編程——JDBC基礎

JDBC編程

  • 一、概述
    • 1.1 概念介紹
    • 1.2 驅動包下載
    • 1.3 導入驅動包
  • 二、通過Java程序操作數據庫
    • 2.1 通過 JDBC 進行 插入數據 操作
      • 2.1.1 創建“數據源(DataSource)——描述要操作的數據庫、數據是在哪”
      • 2.1.2 與服務器建立連接
      • 2.1.3 構造sql語句,并且對字符串類型的sql進行識別和編譯
      • 2.1.4 將編譯好的sql語句傳給服務器,并且執行sql
      • 2.1.5 釋放前面占用的各種資源
      • 2.1.6 完整代碼
    • 2.2 通過 JDBC 進行 查詢數據 操作

一、概述

1.1 概念介紹

  1. JDBC:Java Databases Connectivity——Java語言連接數據庫
  2. Java通過JDBC這樣的技術連接MySQL數據庫,MySQL是一個基于C/C++實現的數據庫,本身也提供了一系列的API,從而可以通過代碼操作數據庫
  3. API: Application Programming Interface——應用程序編程接口,這是一個通用的概念,不僅僅局限于Java當中;可以把這個詞理解為“一組類”/“一組方法”,都是現成的,可以直接調用實現一些功能;對于Java來說,Java提供了“標準庫”,只要安裝了Java,此時就能使用標準庫中的類和方法(標準庫API),也可以使用別人寫的類和方法(第三方API);有的庫,提供的API非常多,形成了一系列體系.這種情況也可以稱為“SDK”(軟件開發工具包)——Software development kit;Java中用到的JDK就是一個SDK,只不過起了個專屬的名字Java開發工具包
  4. 不同數據庫提供的API不同(功能上大同小異,細節上存在很大差異),那么在項目中使用到不同的數據庫時,就需要掌握多分api的使用,非常麻煩,這時候Java出版了一套API接口標準,使他們都按照該標準適配過來(每個數據庫廠商只需要額外寫一些代碼,能夠按照Java提供的標準把原有的API封裝一下),后續僅需掌握Java這一套API(JDBC),就可以切換各種數據庫了,如下圖:
    在這里插入圖片描述
  5. JDBC是Java標準庫提供的,只要裝了JDK就自帶JDBC,但是使用JDBC操作MySQL需要安裝并導入MySQL的驅動包(數據庫驅動)

1.2 驅動包下載

中央倉庫:https://mvnrepository.com/

  1. 搜索MySQL
    在這里插入圖片描述

  2. 找到與MySQL對應的版本(只要大版本相同即可,比如我的MySQL版本是8.0.34,驅動包只要是8開頭的版本都行)
    如果你的MySQL是比較新的就點擊新版本,否則就點擊舊版本
    在central中查看版本
    在這里插入圖片描述

在這里插入圖片描述

  1. 選擇版本后,點擊jar下載即可
    在這里插入圖片描述
    在這里插入圖片描述
    .jar文件就是類似于.rar文件的壓縮包,是最常見的一種發布Java程序方式,其中包含了很多的.class(Java編譯生成的字節碼文件)文件
    或者在項目中配置pom文件,使用maven下載
    在這里插入圖片描述

1.3 導入驅動包

這里我使用的是IDEA編譯器

  1. 創建一個Java項目
  2. 在項目中隨便創建一個目錄
    在這里插入圖片描述
  3. 把jar文件拷貝到剛剛創建的目錄(lib)中,
    在這里插入圖片描述
  4. 右鍵目錄,選擇Add as library
    告訴IDEA,這個目錄存放的是第三方庫,此時IDEA就能識別拷貝進來的驅動包了
    添加完上述,可以看到這個jar文件可以展開了,說明能被識別
    在這里插入圖片描述
    上述操作是JDBC程序的準備操作,接下來就可以寫代碼了

二、通過Java程序操作數據庫

2.1 通過 JDBC 進行 插入數據 操作

先在數據庫新建一張表,雖然通過JDBC也能進行建表操作,一般都是提前建好表的
在這里插入圖片描述
接下來準備往people這張表來插入數據

2.1.1 創建“數據源(DataSource)——描述要操作的數據庫、數據是在哪”

在MySQL中,要設定好MySQL服務器的位置,訪問數據庫的用戶名、用戶密碼以及數據庫名
在這里插入圖片描述
以上要包含的是JDBC自帶的interface(接口),而接口是不能直接new的,所以需要new一個實現該接口的類的實例
因為需要操作MySQL數據庫,所以new一個MySQL提供的類MysqlDataSource,這就是MySQL廠商提供的驅動包里面的類,需要包含信息
在這里插入圖片描述

//向上轉型
DataSource dataSource = new MysqlDataSource();

以上過程就是數據庫廠商(MySQL)和JDBC進行對接,就是讓數據庫廠商實現JDBC中提供的接口,進一步的實現其中約定好的抽象方法

//向下轉型,并且設置url
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/learn_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");

Url:唯一資源定位符;MySQL是一個 客戶端—服務器 的程序,服務器是保存數據的本體,當前寫的 jdbc 代碼,就是在寫一個 mysql 客戶端;之前的cmd黑框是MySQL自帶的客戶端,這里可以通過Java代碼通過JDBC自己實現客戶端,然后客戶端通過網絡訪問到數據庫服務器(不是cmd黑框啟動的那個),才能進一步的進行數據庫操作;要想訪問服務器,就需要知道服務器所在位置,這里的Url就是描述服務器以及服務器上的資源在網絡上所在的位置,
其中jdbc:mysql:代表給jdbc中的MySQL使用的url,127.0.0.1代表ip地址(描述的是一個主機/電腦在網絡上的位置,這里本地ip默認為127.0.0.1),3306端口號(區分了主機上的應用程序,這里是MySQL默認的端口號),learn_db為即將要操作的數據庫的名字,characterEncoding=utf8表示指定字符集為utf8,useSSl=false表示關閉加密通信,不寫的話可能會由于依賴程序有問題導致數據庫連接失敗,serverTimezone=Asia/Shanghai表示配置數據庫時間,確保其正確
除了設置Url之外,還需要設置用戶名密碼

  ((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");

其中root為默認用戶名,密碼為123456
DataSource需要對接不同的數據庫,對于MySQL來說,設置的為url,user,password;對于其他數據庫就不一定了,所以需要向下轉型為MysqlDataSource

2.1.2 與服務器建立連接

進行 客戶端—服務器 之間通信的時候,一般兩種通信模式:
(1)有連接 (類似于打電話,對方必須接通才能進行通話)
(2)無連接 (類似于發短信,不需要對方操作,直接可以發送成功)
這里的JDBC就屬于“有連接”的這種模式,則需要先進行“撥號”——dataSource.getConnection();
在這里插入圖片描述
在這里插入圖片描述

寫完之后,發現報錯了,這里查看信息后發現沒有處理異常,這里使用throws關鍵字顯式處理該受查異常
在這里插入圖片描述
處理后就不報錯了
下面使用Connection(選擇java.sql包中的Connection)來進行接收
在這里插入圖片描述

Connection connection= dataSource.getConnection();

做到這一步后,如果能夠編譯成功說明可以與MySQL服務器進行連接了,后面就可以寫sql語句了

2.1.3 構造sql語句,并且對字符串類型的sql進行識別和編譯

雖然是通過Java來操作數據庫,但是核心還是需要通過執行sql語句來操作數據庫,只不過是把sql嵌入Java中了

String sql = "insert into people values(1,'小明')";

預編譯sql語句
以上是字符串結構的sql語句,還需要構造語句對象,使JDBC能夠識別
有兩種方法:使用Statement或者PrepareStatement
其中Statement是一個普通的語句對象,而PrepareStatement則是帶有預編譯(一個字符串sql發送到MySQL服務器上,是要先對sql進行解析,然后進行各種校驗,之后才能執行——這個操作需要花費一定開銷的,雖然開銷不大,但是MySQL服務器要同時給多個客戶端提供服務,為了減輕服務器的負擔,這里現在客戶端預編譯好,把解析后的數據交給服務器,服務器可以立即執行) 功能的語句對象;
所以下面推薦使用PrepareStatement

 PreparedStatement preparedStatement = connection.prepareStatement(sql);

2.1.4 將編譯好的sql語句傳給服務器,并且執行sql

對于insert、update、delete(對數據庫進行改動的操作)都是使用executeUpdate方法
對于select則是使用executeQuery方法

 int n = preparedStatement.executeUpdate(); //返回結果為整數,表示當前操作影響到了幾行數據System.out.println("n="+n);                //查看影響行數

執行這個方法,就在內部會向服務器發送請求,請求中就是包含了解析后的sql語句
等待數據庫執行sql;執行完成就會返回響應,這個方法再獲取到響應,并且把數據庫返回的結果通過返回值體現出來

2.1.5 釋放前面占用的各種資源

注意:釋放 語句對象 和 連接對象 dataSource不必釋放
釋放順序和創建順序相反

 preparedStatement.close();connection.close();

完成以上操作就可以運行代碼了,運行前,people表中數據為空
在這里插入圖片描述
運行后,n=1說明1行受影響
在這里插入圖片描述
再次查詢people表后發現數據添加成功
在這里插入圖片描述

2.1.6 完整代碼

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) throws SQLException {//接下來通過 JDBC 進行一個簡單的插入數據的操作//JDBC 步驟比較多,每個步驟都不難,都是固定討論//1.創建“數據源(DataSource)DataSource dataSource = new MysqlDataSource(); //向上轉型//向下轉型((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/learn_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");//2. 和MySQL服務器建立連接Connection connection= dataSource.getConnection();//3.構造sql語句,并且對字符串類型的sql進行識別和編譯(PrepareStatement才能編譯,Statement不能編譯)String sql = "insert into people values(1,'小明')";PreparedStatement preparedStatement = connection.prepareStatement(sql);//4. 將編譯好的sql語句傳給服務器,并且執行sqlint n = preparedStatement.executeUpdate(); //返回結果為整數,表示當前操作影響到了幾行數據System.out.println("n="+n);//5. 釋放前面占用的各種資源preparedStatement.close();connection.close();}
}

手動輸入的代碼:

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;public class JDBCDemo {public static void main(String[] args) throws SQLException {//接下來通過 JDBC 進行一個簡單的插入數據的操作//JDBC 步驟比較多,每個步驟都不難,都是固定討論//1.創建“數據源(DataSource)DataSource dataSource = new MysqlDataSource(); //向上轉型//向下轉型((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/learn_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");//2. 和MySQL服務器建立連接Connection connection= dataSource.getConnection();//手動輸入信息System.out.println("請輸入id");Scanner scanner = new Scanner(System.in);int id = scanner.nextInt();System.out.println("請輸入姓名");String name = scanner.next();//3.構造sql語句,并且對字符串類型的sql進行識別和編譯(PrepareStatement才能編譯,Statement不能編譯)String sql = "insert into people values(?,?)";//?代表占位符PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,id);preparedStatement.setString(2,name);//4. 將編譯好的sql語句傳給服務器,并且執行sqlint n = preparedStatement.executeUpdate(); //返回結果為整數,表示當前操作影響到了幾行數據System.out.println("n="+n);//5. 釋放前面占用的各種資源preparedStatement.close();connection.close();}
}System.out.println("n="+n);//5. 釋放前面占用的各種資源preparedStatement.close();connection.close();}
}

2.2 通過 JDBC 進行 查詢數據 操作

查詢操作由于要在idea里面返回結果,所以不同于增刪改操作;
代碼如下:

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class JDBCDemo2 {public static void main(String[] args) throws SQLException {DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/learn_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");Connection connection = dataSource.getConnection();String sql = "select * from people";PreparedStatement preparedStatement = connection.prepareStatement(sql);ResultSet resultSet=preparedStatement.executeQuery();while(resultSet.next()){int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println(id+" "+name);}resultSet.close();preparedStatement.close();connection.close();}
}

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

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

相關文章

DeepSeek-R1 面試題匯總

Deepseek-r1 面試寶典 原文地址:https://articles.zsxq.com/id_91kirfu15qxw.html DeepSeek-R1 面試題匯總 DeepSeek-R1 面試題匯總 GRPO(Group Relative Policy Optimization)常見面試題匯總篇 DeepSeek-R1 DeepSeek-R1-Zero 常見面試題匯總…

SSL/TLS

http ssl傳輸層 -> https 安全套接層 SSL/TLS 1、核心角色與文件2、證書生成流程2.1、生成CA根證書2.2、生成服務端證書2.3 生成客戶端證書(雙向認證) 3、SSL/TLS 認證模式3.1、單向認證(默認 HTTPS)3.2、雙向認證&#xff0…

HTML 音頻(Audio)學習筆記

一、HTML 音頻概述 在 HTML 中&#xff0c;音頻可以通過多種方式播放&#xff0c;但要確保音頻在不同瀏覽器和設備上都能正常播放&#xff0c;需要掌握一些技巧。HTML5 引入了 <audio> 元素&#xff0c;為音頻播放提供了一種標準方法&#xff0c;但在 HTML4 中&#xff…

php開發rest api,哪個框架最好

在 2025 年&#xff0c;選擇適合開發 REST API 的 PHP 框架需要根據項目需求、性能要求和團隊技術棧進行權衡。以下是一些推薦的 PHP 框架及其適用場景&#xff1a; 1. Laravel 特點&#xff1a;功能豐富&#xff0c;生態系統強大&#xff0c;內置 API 資源&#xff0c;支持 …

前端入門之CSS

CSS: HTML負責定義頁面結構;JS負責處理頁面邏輯和點擊事件;CSS負責用于描述 HTML 元素的顯示方式,通過 CSS 可以控制顏色、字體、布局等。 核心語法: 選擇器: 類選擇器主要用于選中需要添加樣式的 HTML 元素。主要分為:類選擇器(.class-name { ... })、標簽選擇器(…

MCP協議的Streamable HTTP:革新數據傳輸的未來

引言 在數字化時代&#xff0c;數據傳輸的效率和穩定性是推動技術進步的關鍵。MCP&#xff08;Model Context Protocol&#xff09;作為AI生態系統中的重要一環&#xff0c;通過引入Streamable HTTP傳輸機制&#xff0c;為數據交互帶來了革命性的變化。本文將深入解讀MCP協議的…

MySQL - 索引原理與優化:深入解析B+Tree與高效查詢策略

文章目錄 引言一、BTree索引核心原理1.1 索引數據結構演化1.2 BTree的存儲結構通過主鍵查詢&#xff08;主鍵索引&#xff09;商品數據的過程通過非主鍵&#xff08;輔助索引&#xff09;查詢商品數據的過程 MySQL InnoDB 的索引原理 二、執行計劃深度解析三、索引失效的六大陷…

《K230 從熟悉到...》識別機器碼(AprilTag)

《K230 從熟悉到...》識別機器碼&#xff08;aprirltag&#xff09; tag id 《廬山派 K230 從熟悉到...》 識別機器碼&#xff08;AprilTag&#xff09; AprilTag是一種基于二維碼的視覺標記系統&#xff0c;最早是由麻省理工學院&#xff08;MIT&#xff09;在2008年開發的。A…

Linux驅動復習

應用層調用內核層函數稱為系統調用 1.硬件設備管理 1&#xff0c;字符設備驅動&#xff08;一個一個字節&#xff09;——芯片內部外設 &#xff1a;WDT,Timer&#xff0c;adc,iic&#xff0c;SPI,R,UART,LCD,CAMERA,USB,Keyboard&#xff0c;Mouse 2&#xff0c;塊設備驅動&a…

【FAQ】HarmonyOS SDK 閉源開放能力 —Account Kit(3)

1.問題描述&#xff1a; PC場景&#xff0c;青少年模式系統API不支持嗎&#xff1f; 解決方案&#xff1a; PC場景&#xff0c;青少年模式系統API不支持&#xff0c;另外文檔上的幾個API也不支持。 2.問題描述&#xff1a; 華為一鍵登錄 Beta7本地運行到手機可以拿到匿名手…

【gdutthesis模板】論文標題太長導致換頁問題解決

標題太長導致換頁問題解決方案如下&#xff1a; 調小下方數值即可

SAP學習筆記 - 豆知識18 - (TODO)Msg 番號 ME154 構成品目無法決定

1&#xff0c;現象 構成品目の決定は不可能です Msg 番號 ME154 構成品目無法決定 2&#xff0c;到Deepseek里找一下解決方案 SAP ME21N中錯誤「組件物料的確定不可行&#xff08;ME154&#xff09;」的解決步驟 此錯誤在創建分包采購訂單時出現&#xff0c;通常由于系統無…

10.多線程

預備知識 預備知識一 預備知識二 預備知識三 如何理解進程和線程的關系&#xff0c;舉一個生活中的例子 家庭&#xff1a;進程家庭成員&#xff1a;線程 每個家庭成員都會為這個家庭做貢獻&#xff0c;只不過大家都在做不同的事情&#xff08;比如&#xff1a;我們在上學&…

Python入門(8):文件

1. 文件基本概念 文件&#xff1a;存儲在計算機上的數據集合&#xff0c;Python 通過文件對象來操作文件。 文件類型&#xff1a; 文本文件&#xff1a;由字符組成&#xff0c;如 .txt, .py 二進制文件&#xff1a;由字節組成&#xff0c;如 .jpg, .mp3 2. 文件打開與關閉…

市場交易策略優化與波動管理

市場交易策略優化與波動管理 在市場交易中&#xff0c;策略的優化和波動的管理至關重要。市場價格的變化受多種因素影響&#xff0c;交易者需要根據市場環境動態調整策略&#xff0c;以提高交易的穩定性&#xff0c;并有效規避市場風險。 一、市場交易策略的優化方法 趨勢交易策…

HTTP數據傳輸的幾個關鍵字Header

本文著重針對http在傳輸數據時的幾種封裝方式進行描述。 1. Content-Type(描述body內容類型以及字符編碼) HTTP的Content-Type用于定義數據傳輸的媒體類型&#xff08;MIME類型&#xff09;&#xff0c;主要分為以下幾類&#xff1a; (一)、?基礎文本類型? text/plain? …

面向教育領域的實時更新RAG系統:核心模塊設計與技術選型實踐指南

目錄 面向教育領域的實時更新RAG系統&#xff1a;核心模塊設計與技術選型實踐指南 一、業務需求分析 二、系統架構設計&#xff08;核心模塊&#xff09; 三、核心模塊詳解與技術選型建議 &#xff08;一&#xff09;實時更新向量知識庫 &#xff08;二&#xff09;教材與…

k8s patch方法更新deployment和replace方法更新deployment的區別是什么

在Kubernetes中&#xff0c;patch 和 replace 方法用于更新資源&#xff08;如 Deployment&#xff09;&#xff0c;但它們的實現方式和適用場景有顯著差異。以下是兩者的核心區別&#xff1a; 1. 更新范圍 replace 方法 完全替換整個資源配置。需要用戶提供完整的資源定義&…

解決安卓手機WebView無法直接預覽PDF的問題(使用PDF.js方案)

在移動端開發中&#xff0c;通過 webview 組件直接加載PDF文件時&#xff0c;不同平臺的表現差異較大&#xff1a; iOS & 部分安卓瀏覽器&#xff1a;可正常內嵌預覽&#xff08;依賴系統內置PDF渲染能力&#xff09; 大多數安卓設備&#xff1a;由于缺乏原生PDF插件&…

基于javaweb的SSM+Maven機房管理系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…