使用Java增刪改查數(shù)據(jù)庫(kù)的操作方法
前言
既然連接數(shù)據(jù)庫(kù)都可以通過(guò)java語(yǔ)言實(shí)現(xiàn),那么通過(guò)java語(yǔ)言對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查的操作自然是順理成章的事情了。
一、PrepareStatement類(lèi)是什么?
PrepareStatement類(lèi)是Java JDBC API中的一個(gè)類(lèi),用于執(zhí)行預(yù)編譯的SQL語(yǔ)句。這個(gè)類(lèi)實(shí)現(xiàn)java語(yǔ)言增刪改查數(shù)據(jù)庫(kù)的功能。它是Statement的子接口,提供了更高級(jí)別和更靈活的功能。(所以在編譯SQL語(yǔ)句的時(shí)候,不要使用Statement類(lèi),直接使用它的子接口吧?。?/p>
通過(guò)使用PrepareStatement類(lèi),可以先將SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)進(jìn)行編譯,然后可以重復(fù)執(zhí)行該語(yǔ)句,并且可以使用參數(shù)化查詢(xún)和批處理等高級(jí)功能。
PrepareStatement類(lèi)可以防止SQL注入攻擊,提高性能,并且可以方便地處理不同類(lèi)型的數(shù)據(jù)。
SQL注入攻擊,以statement類(lèi)為例,當(dāng)使用Statement對(duì)象執(zhí)行動(dòng)態(tài)拼接SQL語(yǔ)句時(shí),如果不對(duì)用戶(hù)輸入進(jìn)行正確的過(guò)濾和轉(zhuǎn)義,攻擊者可以通過(guò)構(gòu)造惡意的“密碼"進(jìn)行輸入來(lái)修改或執(zhí)行未經(jīng)授權(quán)的SQL語(yǔ)句。(利用轉(zhuǎn)義漏洞,繞過(guò)了賬號(hào)密碼,直接訪(fǎng)問(wèn)并可以攻擊數(shù)據(jù))
PrepareStatement的構(gòu)造方法:
connection.PrepareStatement(String sql); //創(chuàng)建一個(gè)新的PrepareStatement對(duì)象,以指定的SQL語(yǔ)句初始化。 connection.PrepareStatement(String sql, int autoGeneratedKeys); //創(chuàng)建一個(gè)新的PrepareStatement對(duì)象,以指定的SQL語(yǔ)句和生成的鍵標(biāo)志初始化。 connection.PrepareStatement(String sql, int[] columnIndexes); //創(chuàng)建一個(gè)新的PrepareStatement對(duì)象,以指定的SQL語(yǔ)句和列索引標(biāo)志初始化。 connection.PrepareStatement(String sql, String[] columnNames); //創(chuàng)建一個(gè)新的PrepareStatement對(duì)象,以指定的SQL語(yǔ)句和列名標(biāo)志初始化。
PrepareStatement類(lèi)是沒(méi)有直接的構(gòu)造方法的,但是可以通過(guò)Connection對(duì)象調(diào)用PrepareStatement()方法來(lái)創(chuàng)建自己的對(duì)象。第一個(gè)方法是最經(jīng)常使用的,其他的想忽略也行。
方法 | 功能描述 | 返回值 |
setNull(int parameterIndex, int sqlType) | 將指定的參數(shù)設(shè)置為SQL NULL | void |
setBoolean(int parameterIndex, boolean x) | 將指定參數(shù)設(shè)置為給定的Java布爾值 | void |
setByte(int parameterIndex, byte x) | 將指定參數(shù)設(shè)置為給定的Java字節(jié)值 | void |
setShort(int parameterIndex, short x) | 將指定參數(shù)設(shè)置為給定的Java short值 | void |
setInt(int parameterIndex, int x) | 將指定參數(shù)設(shè)置為給定的Java int值 | void |
setLong(int parameterIndex, long x) | 將指定參數(shù)設(shè)置為給定的Java long值 | void |
setFloat(int parameterIndex, float x) | 將指定參數(shù)設(shè)置為給定的Java float值 | void |
setDouble(int parameterIndex, double x) | 將指定參數(shù)設(shè)置為給定的Java double值 | void |
setBigDecimal(int parameterIndex, BigDecimal x) | 將指定參數(shù)設(shè)置為給定的Java BigDecimal值 | void |
setString(int parameterIndex, String x) | 將指定參數(shù)設(shè)置為給定的Java String值 | void |
setBytes(int parameterIndex, byte[] x) | 將指定參數(shù)設(shè)置為給定的Java 字節(jié)數(shù)組 | void |
setDate(int parameterIndex, Date x) | 將指定參數(shù)設(shè)置為給定的SQL date值 | void |
setTime(int parameterIndex, Time x) | 將指定的參數(shù)設(shè)置為給定的SQL時(shí)間戳值 | void |
setObject(int parameterIndex, Object x) | 將指定參數(shù)設(shè)置為給定的Java Object對(duì)象 | void |
executeQuery() | 執(zhí)行這個(gè)PreparedStatement對(duì)象中的SQL查詢(xún),并返回查詢(xún)生成的ResultSet對(duì)象 | ResultSet |
executeUpdate() | 執(zhí)行這個(gè)PreparedStatement對(duì)象中的SQL語(yǔ)句(可能是INSERT、UPDATE或DELETE語(yǔ)句),并返回受影響行的計(jì)數(shù) | int |
execute() | 執(zhí)行這個(gè)PreparedStatement對(duì)象中的SQL語(yǔ)句,它可能返回多個(gè)結(jié)果 | boolean |
clearParameters() | 清除PreparedStatement對(duì)象中的當(dāng)前參數(shù)值 | void |
setArray(int parameterIndex, Array x) | 將指定參數(shù)設(shè)置為給定的SQL Array對(duì)象 | void |
setBlob(int parameterIndex, Blob x) | 將指定參數(shù)設(shè)置為給定的SQL Blob對(duì)象 | void |
setClob(int parameterIndex, Clob x) | 將指定參數(shù)設(shè)置為給定的SQL Clob對(duì)象 | void |
使用以上PrepareStatement的方法就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪改查的功能了。
PrepareStatement類(lèi)比Statement類(lèi)多一個(gè)預(yù)處理的功能,需要使用到通配符" ? "(也正是該功能減輕了SQL注入攻擊)
所以,PrepareStatement實(shí)例化時(shí)的String數(shù)據(jù)的SQL語(yǔ)句時(shí)不完整的,需要將通配符替換掉,才能進(jìn)行使用,這和格式化輸出語(yǔ)句的道理一樣。
在上面常用方法的表格中,最常見(jiàn)的是set()方法,盡管數(shù)據(jù)類(lèi)型不同,但第一個(gè)參數(shù):int parameterIndex 該參數(shù)都是指在String字符串中編寫(xiě)SQL語(yǔ)句的第幾個(gè)通配符,然后這個(gè)在SQL語(yǔ)句中的問(wèn)號(hào)( ? )可以被你設(shè)置的第二個(gè)數(shù)據(jù)類(lèi)型替代,SQL語(yǔ)句被補(bǔ)全了,可以進(jìn)行下一步執(zhí)行運(yùn)行的操作了。
二、實(shí)操展示
以下的所有操作都建立在連接好數(shù)據(jù)庫(kù)之后,對(duì)連接框架的代碼進(jìn)行了省略。
增刪改查的操作步驟大致都是("查"需要循環(huán)輸出語(yǔ)句反饋到控制臺(tái)):
第一步,創(chuàng)建String對(duì)象,編寫(xiě)SQL語(yǔ)句。
第二步,利用connection對(duì)象調(diào)用方法創(chuàng)建PrepareStatement對(duì)象。
第三步,使用PrepareStatement類(lèi)的set()方法,補(bǔ)全SQL語(yǔ)句中的通配符。
最后一步,調(diào)用PrepareStatement類(lèi)的executeUpdate()方法執(zhí)行該SQL語(yǔ)句。
executeUpdate()方法執(zhí)行后,Java代碼會(huì)將SQL語(yǔ)句發(fā)送給MySQL數(shù)據(jù)庫(kù),并執(zhí)行相應(yīng)的操作,如插入、更新或刪除數(shù)據(jù)。執(zhí)行完畢后,MySQL數(shù)據(jù)庫(kù)會(huì)返回操作的結(jié)果,Java代碼可以通過(guò)executeUpdate()方法獲取到受影響的行數(shù)。
1.增
實(shí)操展示:
這是數(shù)據(jù)庫(kù)表單原本的樣子:
這個(gè)table只有三行,需求:添加一個(gè)id是104,name是小浩的數(shù)據(jù)。
主要代碼:
String sql = "INSERT INTO table_name (id, name) VALUES (?, ?)"; PreparedStatement statement = connection.prepareStatement(sql); statement.setInt(1, 104); statement.setString(2, "小浩"); statement.executeUpdate();
運(yùn)行結(jié)果:
如上圖所示,刷新Workbench,實(shí)時(shí)顯示出了數(shù)據(jù)庫(kù)內(nèi)容的更新。
2.刪
實(shí)操展示:
這是數(shù)據(jù)庫(kù)表單原本的樣子:
需求:刪除一個(gè)id是103,name是小張的數(shù)據(jù)。
主要代碼:
String sql = "DELETE FROM test_table WHERE id = ? AND name = ?"; PreparedStatement statement = con.prepareStatement(sql); statement.setInt(1, 103); statement.setString(2, "小張"); statement.executeUpdate();
運(yùn)行結(jié)果:
如上圖所示,數(shù)據(jù)庫(kù)表單的id=103,name=小張的這一串?dāng)?shù)據(jù)已被刪除。
3.改
實(shí)操展示:
這是數(shù)據(jù)庫(kù)表單原本的樣子:
需求:將id=104 name=小王的這一串?dāng)?shù)據(jù)里,id值修改為103。
主要代碼:
String sql = "UPDATE test_table SET id= ? WHERE id = ? "; PreparedStatement statement = con.prepareStatement(sql); statement.setInt(1, 103); statement.setInt(2, 104); statement.executeUpdate();
運(yùn)行結(jié)果:
如上圖所示,數(shù)據(jù)庫(kù)中小浩的id由104更改為了103。
4.查
這是數(shù)據(jù)庫(kù)表單原本的樣子:
需求:查詢(xún)id為101的用戶(hù)的name值是什么。
主要代碼:
String sql = "SELECT name FROM test_table WHERE id = ? "; PreparedStatement statement = con.prepareStatement(sql); statement.setInt(1, 101); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { // 處理查詢(xún)結(jié)果 String value1 = resultSet.getString("name"); System.out.println("查詢(xún)結(jié)果:id值為101的用戶(hù)名稱(chēng)是 "+value1); }
運(yùn)行結(jié)果:
對(duì)比數(shù)據(jù)庫(kù)的信息:
如上面兩張圖顯示,通過(guò)PrepareStatement類(lèi)可以輕松實(shí)現(xiàn)java后端與數(shù)據(jù)庫(kù)之間的互通。
總結(jié)
以上就是使用java的PrepareStatement類(lèi)對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查的操作,本文初步介紹了java的使用,沒(méi)有寫(xiě)關(guān)于SQL語(yǔ)句之類(lèi)的數(shù)據(jù)庫(kù)知識(shí),有補(bǔ)充或指正的地方,歡迎在評(píng)論區(qū)中留言。
到此這篇關(guān)于使用Java增刪改查數(shù)據(jù)庫(kù)的操作方法的文章就介紹到這了,更多相關(guān)Java增刪改查數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解Java數(shù)據(jù)庫(kù)連接JDBC基礎(chǔ)知識(shí)(操作數(shù)據(jù)庫(kù):增刪改查)
- Java連接數(shù)據(jù)庫(kù),及增刪改查的示例
- java 數(shù)據(jù)庫(kù)連接與增刪改查操作實(shí)例詳解
- Java連接MySQL數(shù)據(jù)庫(kù)增刪改查的通用方法(推薦)
- Java語(yǔ)言實(shí)現(xiàn)對(duì)MySql數(shù)據(jù)庫(kù)中數(shù)據(jù)的增刪改查操作的代碼
- java jdbc連接mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)增刪改查操作
相關(guān)文章
Spring Boot + Jpa(Hibernate) 架構(gòu)基本配置詳解
本篇文章主要介紹了Spring Boot + Jpa(Hibernate) 架構(gòu)基本配置詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Java字符串格式化功能?String.format用法詳解
String類(lèi)的format()方法用于創(chuàng)建格式化的字符串以及連接多個(gè)字符串對(duì)象,熟悉C語(yǔ)言的同學(xué)應(yīng)該記得C語(yǔ)言的sprintf()方法,兩者有類(lèi)似之處,format()方法有兩種重載形式2024-09-09詳解SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類(lèi)型
本文主要介紹了SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類(lèi)型,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié)
在使用java的集合類(lèi)遍歷數(shù)據(jù)的時(shí)候,在某些情況下可能需要對(duì)某些數(shù)據(jù)進(jìn)行刪除,下面這篇文章主要給大家介紹了關(guān)于java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié),需要的朋友可以參考下2023-10-10java連接數(shù)據(jù)庫(kù)增、刪、改、查工具類(lèi)
這篇文章主要介紹了java連接數(shù)據(jù)庫(kù)增、刪、改、查工具類(lèi),需要的朋友可以參考下2014-05-05Spring實(shí)現(xiàn)擁有者權(quán)限驗(yàn)證的方法示例
這篇文章主要介紹了Spring實(shí)現(xiàn)擁有者權(quán)限驗(yàn)證的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Springmvc自定義參數(shù)轉(zhuǎn)換實(shí)現(xiàn)代碼解析
這篇文章主要介紹了Springmvc自定義參數(shù)轉(zhuǎn)換實(shí)現(xiàn)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Java結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式詳細(xì)講解
橋接,顧名思義,就是用來(lái)連接兩個(gè)部分,使得兩個(gè)部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實(shí)現(xiàn)部分分離解耦,使他們可以獨(dú)立的變化。本文通過(guò)示例詳細(xì)介紹了橋接模式的原理與使用,需要的可以參考一下2022-09-09啟動(dòng)SpringBoot報(bào)JavaMail加載錯(cuò)誤的原因分析和解決
這篇文章給大家介紹了啟動(dòng)SpringBoot報(bào)JavaMail加載錯(cuò)誤的原因分析和解決,文中通過(guò)代碼示例給出了詳細(xì)的原因分析和解決方法,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01