使用Java增刪改查數(shù)據(jù)庫的操作方法
前言
既然連接數(shù)據(jù)庫都可以通過java語言實(shí)現(xiàn),那么通過java語言對(duì)數(shù)據(jù)庫進(jìn)行增刪改查的操作自然是順理成章的事情了。
一、PrepareStatement類是什么?
PrepareStatement類是Java JDBC API中的一個(gè)類,用于執(zhí)行預(yù)編譯的SQL語句。這個(gè)類實(shí)現(xiàn)java語言增刪改查數(shù)據(jù)庫的功能。它是Statement的子接口,提供了更高級(jí)別和更靈活的功能。(所以在編譯SQL語句的時(shí)候,不要使用Statement類,直接使用它的子接口吧?。?/p>
通過使用PrepareStatement類,可以先將SQL語句發(fā)送到數(shù)據(jù)庫進(jìn)行編譯,然后可以重復(fù)執(zhí)行該語句,并且可以使用參數(shù)化查詢和批處理等高級(jí)功能。
PrepareStatement類可以防止SQL注入攻擊,提高性能,并且可以方便地處理不同類型的數(shù)據(jù)。
SQL注入攻擊,以statement類為例,當(dāng)使用Statement對(duì)象執(zhí)行動(dòng)態(tài)拼接SQL語句時(shí),如果不對(duì)用戶輸入進(jìn)行正確的過濾和轉(zhuǎn)義,攻擊者可以通過構(gòu)造惡意的“密碼"進(jìn)行輸入來修改或執(zhí)行未經(jīng)授權(quán)的SQL語句。(利用轉(zhuǎn)義漏洞,繞過了賬號(hào)密碼,直接訪問并可以攻擊數(shù)據(jù))
PrepareStatement的構(gòu)造方法:
connection.PrepareStatement(String sql); //創(chuàng)建一個(gè)新的PrepareStatement對(duì)象,以指定的SQL語句初始化。 connection.PrepareStatement(String sql, int autoGeneratedKeys); //創(chuàng)建一個(gè)新的PrepareStatement對(duì)象,以指定的SQL語句和生成的鍵標(biāo)志初始化。 connection.PrepareStatement(String sql, int[] columnIndexes); //創(chuàng)建一個(gè)新的PrepareStatement對(duì)象,以指定的SQL語句和列索引標(biāo)志初始化。 connection.PrepareStatement(String sql, String[] columnNames); //創(chuàng)建一個(gè)新的PrepareStatement對(duì)象,以指定的SQL語句和列名標(biāo)志初始化。
PrepareStatement類是沒有直接的構(gòu)造方法的,但是可以通過Connection對(duì)象調(diào)用PrepareStatement()方法來創(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查詢,并返回查詢生成的ResultSet對(duì)象 | ResultSet |
| executeUpdate() | 執(zhí)行這個(gè)PreparedStatement對(duì)象中的SQL語句(可能是INSERT、UPDATE或DELETE語句),并返回受影響行的計(jì)數(shù) | int |
| execute() | 執(zhí)行這個(gè)PreparedStatement對(duì)象中的SQL語句,它可能返回多個(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ù)庫的增刪改查的功能了。
PrepareStatement類比Statement類多一個(gè)預(yù)處理的功能,需要使用到通配符" ? "(也正是該功能減輕了SQL注入攻擊)
所以,PrepareStatement實(shí)例化時(shí)的String數(shù)據(jù)的SQL語句時(shí)不完整的,需要將通配符替換掉,才能進(jìn)行使用,這和格式化輸出語句的道理一樣。
在上面常用方法的表格中,最常見的是set()方法,盡管數(shù)據(jù)類型不同,但第一個(gè)參數(shù):int parameterIndex 該參數(shù)都是指在String字符串中編寫SQL語句的第幾個(gè)通配符,然后這個(gè)在SQL語句中的問號(hào)( ? )可以被你設(shè)置的第二個(gè)數(shù)據(jù)類型替代,SQL語句被補(bǔ)全了,可以進(jìn)行下一步執(zhí)行運(yùn)行的操作了。
二、實(shí)操展示
以下的所有操作都建立在連接好數(shù)據(jù)庫之后,對(duì)連接框架的代碼進(jìn)行了省略。
增刪改查的操作步驟大致都是("查"需要循環(huán)輸出語句反饋到控制臺(tái)):
第一步,創(chuàng)建String對(duì)象,編寫SQL語句。
第二步,利用connection對(duì)象調(diào)用方法創(chuàng)建PrepareStatement對(duì)象。
第三步,使用PrepareStatement類的set()方法,補(bǔ)全SQL語句中的通配符。
最后一步,調(diào)用PrepareStatement類的executeUpdate()方法執(zhí)行該SQL語句。
executeUpdate()方法執(zhí)行后,Java代碼會(huì)將SQL語句發(fā)送給MySQL數(shù)據(jù)庫,并執(zhí)行相應(yīng)的操作,如插入、更新或刪除數(shù)據(jù)。執(zhí)行完畢后,MySQL數(shù)據(jù)庫會(huì)返回操作的結(jié)果,Java代碼可以通過executeUpdate()方法獲取到受影響的行數(shù)。
1.增
實(shí)操展示:
這是數(shù)據(jù)庫表單原本的樣子:

這個(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ù)庫內(nèi)容的更新。
2.刪
實(shí)操展示:
這是數(shù)據(jù)庫表單原本的樣子:

需求:刪除一個(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ù)庫表單的id=103,name=小張的這一串?dāng)?shù)據(jù)已被刪除。
3.改
實(shí)操展示:
這是數(shù)據(jù)庫表單原本的樣子:

需求:將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ù)庫中小浩的id由104更改為了103。
4.查
這是數(shù)據(jù)庫表單原本的樣子:

需求:查詢id為101的用戶的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()) {
// 處理查詢結(jié)果
String value1 = resultSet.getString("name");
System.out.println("查詢結(jié)果:id值為101的用戶名稱是 "+value1);
}運(yùn)行結(jié)果:

對(duì)比數(shù)據(jù)庫的信息:

如上面兩張圖顯示,通過PrepareStatement類可以輕松實(shí)現(xiàn)java后端與數(shù)據(jù)庫之間的互通。
總結(jié)
以上就是使用java的PrepareStatement類對(duì)數(shù)據(jù)庫進(jìn)行增刪改查的操作,本文初步介紹了java的使用,沒有寫關(guān)于SQL語句之類的數(shù)據(jù)庫知識(shí),有補(bǔ)充或指正的地方,歡迎在評(píng)論區(qū)中留言。
到此這篇關(guān)于使用Java增刪改查數(shù)據(jù)庫的操作方法的文章就介紹到這了,更多相關(guān)Java增刪改查數(shù)據(jù)庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中的WebSocketSession原理詳解
這篇文章主要介紹了SpringBoot中的WebSocketSession原理詳解,傳統(tǒng)的?HTTP?協(xié)議是無法支持實(shí)時(shí)通信的,因?yàn)樗且环N無狀態(tài)協(xié)議,每次請(qǐng)求都是獨(dú)立的,無法保持連接。為了解決這個(gè)問題,WebSocket?協(xié)議被引入,需要的朋友可以參考下2023-07-07
springboot如何通過session實(shí)現(xiàn)單點(diǎn)登入詳解
單點(diǎn)登錄(SSO)的定義是在多個(gè)應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng),下面這篇文章主要給大家介紹了關(guān)于springboot如何通過session實(shí)現(xiàn)單點(diǎn)登入的相關(guān)資料,需要的朋友可以參考下2021-12-12
使用java swing實(shí)現(xiàn)qq登錄界面示例分享
這篇文章主要介紹了使用java swing實(shí)現(xiàn)qq登錄界面示例,需要的朋友可以參考下2014-04-04
java計(jì)算兩個(gè)時(shí)間相差天數(shù)的方法匯總
這篇文章主要介紹了java計(jì)算兩個(gè)時(shí)間相差天數(shù)的方法,感興趣的小伙伴們可以參考一下2015-11-11
Java Spring的@Async的使用及注意事項(xiàng)示例總結(jié)
這篇文章主要介紹了Java Spring的@Async使用及注意事項(xiàng)的相關(guān)資料,Spring框架中的@Async注解用于標(biāo)記方法在單獨(dú)線程中異步執(zhí)行,適用于耗時(shí)操作,提高性能和響應(yīng)速度,需要的朋友可以參考下2025-05-05

