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

這個table只有三行,需求:添加一個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();
運行結(jié)果:

如上圖所示,刷新Workbench,實時顯示出了數(shù)據(jù)庫內(nèi)容的更新。
2.刪
實操展示:
這是數(shù)據(jù)庫表單原本的樣子:

需求:刪除一個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();
運行結(jié)果:

如上圖所示,數(shù)據(jù)庫表單的id=103,name=小張的這一串數(shù)據(jù)已被刪除。
3.改
實操展示:
這是數(shù)據(jù)庫表單原本的樣子:

需求:將id=104 name=小王的這一串數(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();
運行結(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);
}運行結(jié)果:

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

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

