JDBC操作流程

目錄

簡介

具體操作

1. 引入驅動包

1)下載驅動包

2)引入驅動包到項目中

2. 編寫代碼

1)創建數據源

2)建立連接

3)構造 SQL 語句

4)執行 SQL 語句

5)釋放資源

總結


簡介

JDBC 就是使用 Java 代碼來操作數據庫。市面上有很多種數據庫,其中每種數據庫都有著自己的一套 API,Java 為了方便,統一所有數據庫都來實現 JDBC 這套API,使得所有類型的數據庫在Java 中都可以按照 JDBC 這套 API 提供的方式來操作。

JDBC 是一套 API,而不同的數據庫又有自己的一套 API,因此使用 JDBC 操作數據庫的時候,就需要進行 API 之間的轉化,數據庫廠商就提供了專門的代碼來進行轉化——數據庫驅動包( 作用類似于翻譯官 )

具體操作

此處使用 MySQL 作為示例:

1. 引入驅動包

1)下載驅動包

首先,我們需要下載 MySQL 的驅動包。可以從多種渠道,例如官方網站,Github( 如果是一個開源項目 ),其中最方便的就是在 Maven 中央倉庫中進行下載:https://mvnrepository.com/

在搜素框中搜索需要的數據庫,然后選擇所需的版本,注意大版本需要和數據庫服務器版本保持一致,小版本無所謂( 小數點后的版本號 )。然后點擊類似下圖中的位置進行下載:

2)引入驅動包到項目中

下載完成之后,需要引入到我們現有的項目中( 下述是以一個最普通的項目來作為示例 ):

創建一個專門存放依賴包的目錄,一般命名為 lib,將 jar 包放到該目錄下,如果點擊下圖中的選項,使該目錄下的 jar 包能夠被正常識別:

2. 編寫代碼

1)創建數據源

數據源指明了我們的數據庫服務器地址,具體代碼如下:

DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/testTable?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");

DataSource 是 JDBC 提供的一個 interface,MysqlDataSource 是 MySQL 驅動包提供的類,該類實現了 DataSource 這個 interface。上述調用的 setUrl、setUser、setPassword 方法都是MysqlDataSource 這個子類的方法,因此調用之前需要進行向下轉型。

上述轉型的寫法是推薦寫法,雖然下述寫法是更方便的寫法,但是轉型的目的是希望不要讓MysqlDataSource 這個類擴散到其他代碼,其他代碼使用 datasource 對象時,仍然是一個JDBC 提供的 DataSource 類的對象而不是一個 MySQL 驅動包提供的 MysqlDataSource 類的對象,降低 MySQL 驅動包和項目代碼的耦合程度,后續方便更換數據庫。

MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/testTable?characterEncoding=utf8&useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("root");

上述的 setURL 中的參數是一個固定模板,其中每個部分的具體含義如下:

  • jdbc:mysql:表明當前這個 URL 的具體用途,是給 JDBC 的 MySQL 進行使用的;
  • 127.0.0.1:當前數據源指向的數據庫服務器的IP地址;
  • 3306:當前數據源指向的數據庫服務器的上的數據庫應用程序所占據的端口號;
  • testTable:數據庫名字;
  • characterEncoding=utf8:統一字符集為utf8,避免使用中文等其他語言時出現亂碼;
  • useSSL=false:設置數據庫服務器和客戶端之間的通信是否進行加密。
2)建立連接

上述只是創建了一個數據源,真正連上數據庫還需要創建一個和數據庫服務器的連接:

Connection connection = dataSource.getConnection();

注意上述的Connection類需要導入的是JDBC下的類:

3)構造 SQL 語句

假設現在有一個表中有兩列:id int,name varchar(20)

String sql = "insert into student values(1, '張三')";
PreparedStatement statement = connection.prepareStatement(sql);

我們在代碼中創建的SQL語句本身,是 String 類型的,但是 JDBC 并不認識字符串類型的 SQL,因此 JDBC 提供了 Statement(語句)對象,可以把 String 轉換成 Statement 再發給服務器執行。但是,一般會使用 PreparedStatement(預處理的語句)對象來代替 Statement。

這二者的區別是:

  • Statement 是把 SQL 直接發給數據庫服務器,數據庫服務器來負責解析 SQL;
  • PreparedStatement 會先在客戶端這邊初步解析一下 SQL( 驗證語法格式是否符合要求啥的 ),此時服務器就不用做這些檢查了,從而降低服務器的負擔。

除了上述這種寫死的語句,也可以動態構造 SQL 語句:

注意下述這種寫法:

String sql = "insert into student values(" + id + ", '" + name + "')";
PreparedStatement statement = connection.prepareStatement(sql);

雖然這種寫法也可以,但是存在問題:可讀性低,代碼混亂和存在SQL注入風險。

因此更推薦下述寫法:

String sql = "insert into student values(?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);

具體步驟:

  1. 使用" ? "來作為參數的占位符
  2. 使用特定的 setXXX 方法,來設置占位符所需要的變量。注意此處的的占位符順序是從 1 開始的。執行過程中,setXXX 方法會對參數進行嚴格校驗,避免了 SQL 注入問題。
4)執行 SQL 語句

執行 SQL 語句時,有兩個方法可以選擇:

executeQuery:用于執行寫操作,用于執行查詢語句。其中返回值是 ResultSet,是一個臨時表格。當我們拿到結果集的時候,就需要遍歷這個臨時表格。

ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");
}

使用 resultSet.next() 方法效果如下:

1)存在一個光標,初始位置指向臨時表的第一行記錄的前面;

2)每次執行 next 方法,光標都會往下走,如果存在記錄返回 true,否則返回 false。如果存在記錄則可以拿到該行記錄中的每一列,具體是使用該列的數據類型對應的 getXXX 方法,傳入列名來獲取。

executeUpdate:用于執行寫操作,用于執行增加、刪除、修改語句。其中返回值就是影響的行數。

int n = statement.executeUpdate();
5)釋放資源

創建的語句對象和連接對象等,都會持有一些計算機的 硬件 / 軟件 上的資源,這些資源不用了就需要及時釋放。注意關閉順序:先創建的后關閉。

resultset.close();
statement.close();
connection.close();

總結

上述就是使用 JDBC 的全部流程,整體過程相對比較繁瑣,因此大佬們針對 JDBC 操作進行進一步封裝,得到了一些針對數據庫操作的框架,統稱為 ORM,例如:Mybatis、Mybatis-plus。但是這些框架的背后原理還是使用 JDBC。

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

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

相關文章

某網頁gpt的JS逆向

原網頁網址 (base64) 在線解碼 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果圖 調用代碼(復制即用) 把倒數第三行換成下面的base64解碼 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…

C語言+ MSSQL技術開發的 PACS系統源碼:CT后處理技術之仿真內鏡CTVE

C語言 MSSQL技術開發的 PACS系統源碼:CT后處理技術之仿真內鏡CTVE 仿真內窺鏡VE VE是利用醫學影像作為原始數據,融合圖像處理、計算機圖形學、科學計算可視化、虛擬現實技術,模擬傳統光學內鏡的一種技術。 又叫做腔內重建技術,是…

試用筆記之-匯通來電顯示軟件

首先匯通來電顯示軟件下載 http://www.htsoft.com.cn/download/httelephone.rar

平衡樹專題Splay

寫在前面: 部分來自孫寶(Steven24)的博客,表示感謝。 認識 什么是Splay 就是BST的一種,整體效率是很高的,均攤的次數是O(logn)級別的。 基本操作就是把節點旋轉到BST的root,從而改善BST的平…

為適配kubelet:v0.4 安裝指定版本的docker

系統版本信息 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 0.4 版本的kubelet 報錯信息記錄 E0603 19:00:38.273720 44142 kubelet.go:734] Error syncing pod: API error (400): {"message": "starting container with non-empty reque…

免交互簡單操作

免交互 交互:我們發出指令控制程序的運行,程序在接收到指令后按照指令的效果作出對應的反應 免交互:間接的,通過第三方的方式把指令傳給程序,不用直接下達指令 Here Document免交互 這是命令行格式,也可…

不用找了!這個軟件自帶各行業話術,客服效率飛躍

有一款客服工具軟件,不但能吸附聊天窗口,實現圖文視頻話術的一鍵發送,還內置了多行業的優質客服話術模板,允許用戶直接下載使用,快速構建起適合自身企業的專業客服知識庫。 前言 在今天的快節奏商業環境中&#xff0c…

Linux shell腳本編程

一、sehll簡介: 用戶通過shell向計算機發送指令的 計算機通過shell給用戶返回指令的執行結果 1.1、通過shell編程可以達到的效果 提高工作的效率 可以實現自動化 1.2、sehll腳本編寫的流程 1、用vi/vim創建一個.sh的文件 2、在文件中進行開發 3、個文件賦予可執行權…

CesiumJS【Basic】- #047 繪制閃爍線(Entity方式)- 需要自定義著色器

文章目錄 繪制閃爍線(Entity方式)- 需要自定義著色器1 目標2 代碼2.1 main.ts繪制閃爍線(Entity方式)- 需要自定義著色器 1 目標 使用Entity方式繪制閃爍線 2 代碼 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium<

【如何使用RSA簽名驗簽】python語言

文章目錄 簽名方法異步同步通知數據驗簽生活號響應數據驗簽同步響應數據驗簽 &#x1f308;你好呀&#xff01;我是 山頂風景獨好 &#x1f388;歡迎踏入我的博客世界&#xff0c;能與您在此邂逅&#xff0c;真是緣分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的…

作業7.2

用結構體數組以及函數完成: 錄入你要增加的幾個學生&#xff0c;之后輸出所有的學生信息 刪除你要刪除的第幾個學生&#xff0c;并打印所有的學生信息 修改你要修改的第幾個學生&#xff0c;并打印所有的學生信息 查找你要查找的第幾個學生&#xff0c;并打印該的學生信息 1 /*…

idea常用問題記錄

文章目錄 1.ant構建報錯編譯錯誤1.1 解決辦法 1.ant構建報錯編譯錯誤 Compile failed;xxx 1.1 解決辦法

Python系統教程02

鞏固 input()輸出函數 回顧 1 、 input()函數&#xff1a; 在 input()函數輸入時&#xff0c;輸入的內容一定為字符串類型。 2 、條件分支語句&#xff1a; 每一個 if 語句可以看成一個個體&#xff0c;elif 和 else 都是一個 if 個體的一部分&#xff0c;每一個 if 個體 運…

51單片機外部中斷(按鍵識別)

歡迎入群共同學習交流 時間記錄&#xff1a;2024/7/2 一、電路原理圖 51單片機包含INT0、INT1兩個外部中斷接口 二、知識點介紹 1.中斷寄存器位介紹 &#xff08;1&#xff09;TCON定時控制寄存器&#xff0c;位0&#xff08;IT0&#xff09;中斷INT0請求信號選擇位&#x…

WordPress主題開發進群付費主題v1.1.2 多種引流方式

全新前端UI界面&#xff0c;多種前端交互特效讓頁面不再單調&#xff0c;進群頁面群成員數&#xff0c;群成員頭像名稱&#xff0c;每次刷新頁面隨機更新不重復&#xff0c;最下面評論和點贊也是如此隨機刷新不重復 進群頁面簡介&#xff0c;群聊名稱&#xff0c;群內展示&…

注意!年齡越大,社交圈子越窄?其實這是老人的理性選擇!數學家告訴你:何時該跳槽,何時該堅守!你必須知道的三個智慧:讓你的人生更加精彩!

我們到底應該在什么情況下探索新事物&#xff0c;什么情況下專注于已有的東西呢&#xff1f;本質上來說&#xff0c;這個問題就是在詢問&#xff0c;你究竟應該耗費精力去探索新的信息&#xff0c;還是專注從既有的信息中獲取收獲&#xff1f; 有人采訪了臨終的老人&#xff0c…

中國三大平原矢量示意圖分享

我們在《中國地勢三級階梯示意圖分享》、《中國四大高原矢量示意圖分享》和《中國主要山脈矢量示意圖分享》等文中&#xff0c;為你分享過中國地勢相關的矢量示意圖。 現在再為你分享一下我國東北平原、華北平原和長江中下游平原的矢量示意圖&#xff0c;這三大平原均位于我國…

隨想錄總結 Day 77

隨想錄總結 Day 77 回憶75天的做題時間&#xff0c;差點沒堅持下來的有兩個時間點&#xff0c;一個是在前20天&#xff0c;很多時候二叉樹這種基礎題&#xff0c;前中后序列遍歷之類的。基礎&#xff0c;但真正寫一遍&#xff0c;每道題又有多種寫法。花了很長時間但是也就是一…

go sync包(七)Sync.Map

Sync.Map 原理 通過 read 和 dirty 兩個字段實現數據的讀寫分離&#xff0c;讀的數據存在只讀字段 read 上&#xff0c;將最新寫入的數據存在 dirty 字段上。讀取時會先查詢 read&#xff0c;不存在再查詢 dirty&#xff0c;寫入時則只寫入 dirty。讀取 read 并不需要加鎖&am…

每天一個數據分析題(三百九十九)- 邏輯回歸

邏輯回歸中&#xff0c;若選0.5作為閾值區分正負樣本&#xff0c;其決策平面是&#xff08; &#xff09; A. wxb&#xff1d; 0 B. wxb&#xff1d; 1 C. wxb&#xff1d; -1 D. wxb&#xff1d; 2 數據分析認證考試介紹&#xff1a;點擊進入 題目來源于CDA模擬題庫 點…