使用Java增刪改查數(shù)據(jù)庫的操作方法
前言
既然連接數(shù)據(jù)庫都可以通過java語言實現(xiàn),那么通過java語言對數(shù)據(jù)庫進行增刪改查的操作自然是順理成章的事情了。
一、PrepareStatement類是什么?
PrepareStatement類是Java JDBC API中的一個類,用于執(zhí)行預編譯的SQL語句。這個類實現(xiàn)java語言增刪改查數(shù)據(jù)庫的功能。它是Statement的子接口,提供了更高級別和更靈活的功能。(所以在編譯SQL語句的時候,不要使用Statement類,直接使用它的子接口吧?。?/p>
通過使用PrepareStatement類,可以先將SQL語句發(fā)送到數(shù)據(jù)庫進行編譯,然后可以重復執(zhí)行該語句,并且可以使用參數(shù)化查詢和批處理等高級功能。
PrepareStatement類可以防止SQL注入攻擊,提高性能,并且可以方便地處理不同類型的數(shù)據(jù)。
SQL注入攻擊,以statement類為例,當使用Statement對象執(zhí)行動態(tài)拼接SQL語句時,如果不對用戶輸入進行正確的過濾和轉義,攻擊者可以通過構造惡意的“密碼"進行輸入來修改或執(zhí)行未經(jīng)授權的SQL語句。(利用轉義漏洞,繞過了賬號密碼,直接訪問并可以攻擊數(shù)據(jù))
PrepareStatement的構造方法:
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類是沒有直接的構造方法的,但是可以通過Connection對象調(diào)用PrepareStatement()方法來創(chuàng)建自己的對象。第一個方法是最經(jīng)常使用的,其他的想忽略也行。
方法 | 功能描述 | 返回值 |
setNull(int parameterIndex, int sqlType) | 將指定的參數(shù)設置為SQL NULL | void |
setBoolean(int parameterIndex, boolean x) | 將指定參數(shù)設置為給定的Java布爾值 | void |
setByte(int parameterIndex, byte x) | 將指定參數(shù)設置為給定的Java字節(jié)值 | void |
setShort(int parameterIndex, short x) | 將指定參數(shù)設置為給定的Java short值 | void |
setInt(int parameterIndex, int x) | 將指定參數(shù)設置為給定的Java int值 | void |
setLong(int parameterIndex, long x) | 將指定參數(shù)設置為給定的Java long值 | void |
setFloat(int parameterIndex, float x) | 將指定參數(shù)設置為給定的Java float值 | void |
setDouble(int parameterIndex, double x) | 將指定參數(shù)設置為給定的Java double值 | void |
setBigDecimal(int parameterIndex, BigDecimal x) | 將指定參數(shù)設置為給定的Java BigDecimal值 | void |
setString(int parameterIndex, String x) | 將指定參數(shù)設置為給定的Java String值 | void |
setBytes(int parameterIndex, byte[] x) | 將指定參數(shù)設置為給定的Java 字節(jié)數(shù)組 | void |
setDate(int parameterIndex, Date x) | 將指定參數(shù)設置為給定的SQL date值 | void |
setTime(int parameterIndex, Time x) | 將指定的參數(shù)設置為給定的SQL時間戳值 | void |
setObject(int parameterIndex, Object x) | 將指定參數(shù)設置為給定的Java Object對象 | void |
executeQuery() | 執(zhí)行這個PreparedStatement對象中的SQL查詢,并返回查詢生成的ResultSet對象 | ResultSet |
executeUpdate() | 執(zhí)行這個PreparedStatement對象中的SQL語句(可能是INSERT、UPDATE或DELETE語句),并返回受影響行的計數(shù) | int |
execute() | 執(zhí)行這個PreparedStatement對象中的SQL語句,它可能返回多個結果 | boolean |
clearParameters() | 清除PreparedStatement對象中的當前參數(shù)值 | void |
setArray(int parameterIndex, Array x) | 將指定參數(shù)設置為給定的SQL Array對象 | void |
setBlob(int parameterIndex, Blob x) | 將指定參數(shù)設置為給定的SQL Blob對象 | void |
setClob(int parameterIndex, Clob x) | 將指定參數(shù)設置為給定的SQL Clob對象 | void |
使用以上PrepareStatement的方法就可以實現(xiàn)對數(shù)據(jù)庫的增刪改查的功能了。
PrepareStatement類比Statement類多一個預處理的功能,需要使用到通配符" ? "(也正是該功能減輕了SQL注入攻擊)
所以,PrepareStatement實例化時的String數(shù)據(jù)的SQL語句時不完整的,需要將通配符替換掉,才能進行使用,這和格式化輸出語句的道理一樣。
在上面常用方法的表格中,最常見的是set()方法,盡管數(shù)據(jù)類型不同,但第一個參數(shù):int parameterIndex 該參數(shù)都是指在String字符串中編寫SQL語句的第幾個通配符,然后這個在SQL語句中的問號( ? )可以被你設置的第二個數(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í)行相應的操作,如插入、更新或刪除數(shù)據(jù)。執(zhí)行完畢后,MySQL數(shù)據(jù)庫會返回操作的結果,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();
運行結果:
如上圖所示,刷新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();
運行結果:
如上圖所示,數(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();
運行結果:
如上圖所示,數(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()) { // 處理查詢結果 String value1 = resultSet.getString("name"); System.out.println("查詢結果:id值為101的用戶名稱是 "+value1); }
運行結果:
對比數(shù)據(jù)庫的信息:
如上面兩張圖顯示,通過PrepareStatement類可以輕松實現(xiàn)java后端與數(shù)據(jù)庫之間的互通。
總結
以上就是使用java的PrepareStatement類對數(shù)據(jù)庫進行增刪改查的操作,本文初步介紹了java的使用,沒有寫關于SQL語句之類的數(shù)據(jù)庫知識,有補充或指正的地方,歡迎在評論區(qū)中留言。
到此這篇關于使用Java增刪改查數(shù)據(jù)庫的操作方法的文章就介紹到這了,更多相關Java增刪改查數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Boot + Jpa(Hibernate) 架構基本配置詳解
本篇文章主要介紹了Spring Boot + Jpa(Hibernate) 架構基本配置詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05Java字符串格式化功能?String.format用法詳解
String類的format()方法用于創(chuàng)建格式化的字符串以及連接多個字符串對象,熟悉C語言的同學應該記得C語言的sprintf()方法,兩者有類似之處,format()方法有兩種重載形式2024-09-09詳解SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類型
本文主要介紹了SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類型,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結
在使用java的集合類遍歷數(shù)據(jù)的時候,在某些情況下可能需要對某些數(shù)據(jù)進行刪除,下面這篇文章主要給大家介紹了關于java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結,需要的朋友可以參考下2023-10-10Springmvc自定義參數(shù)轉換實現(xiàn)代碼解析
這篇文章主要介紹了Springmvc自定義參數(shù)轉換實現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07啟動SpringBoot報JavaMail加載錯誤的原因分析和解決
這篇文章給大家介紹了啟動SpringBoot報JavaMail加載錯誤的原因分析和解決,文中通過代碼示例給出了詳細的原因分析和解決方法,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-01-01