1.什麼是JDBC?
為了在java語言中提供數據庫訪問的支持,提供了一套訪問數據的標準Java類庫,即JDBC,JDBC的全稱是Java數據庫連接(Java Database connect),它是一套用於執行SQL語句的 Java API。應用程序可通過這套API連接到關係數據庫,並使用SQL語句來完成對數據庫中數據的查詢、更新和刪除等操作。
2.JDBC驅動程序
2.1 JDBC(Java Database Connectivity)驅動程序是一種軟件組件,用於連接Java應用程序和數據庫。它充當Java應用程序與數據庫之間的橋樑,允許Java應用程序執行SQL(結構化查詢語言)命令,從而與數據庫進行交互。
2.2 JDBC驅動程序的主要功能是:
2.2.1 建立與數據庫的連接:驅動程序使用提供的數據庫URL、用户名和密碼,建立與目標數據庫的連接。
2.2.2 執行SQL語句:通過驅動程序,Java應用程序可以執行SQL語句,如查詢、插入、更新和刪除等。
2.2.3 處理結果集:對於查詢操作,驅動程序將結果集返回給Java應用程序,以便進行進一步處理。
2.2.4 事務管理:驅動程序支持事務處理,確保數據的完整性和一致性。
2.2.5 異常處理:驅動程序處理與數據庫交互過程中可能出現的異常,並確保應用程序的穩定性。
3.JDBC開發流程
3.1 JDBC所需的四個參數(user,password,url定義了連接數據庫時的協議、子協議、數據源標識,它們之間用冒號隔開。書寫形式:協議:子協議:數據源標識,driverClass是連接數據庫所需的驅動)
3.2 加載JDBC驅動程序
3.3 創建數據庫的連接
3.4 創建一個preparedStatement
3.5 執行SQL語句
3.6 遍歷結果集
3.7 處理異常,關閉JDBC對象資源
4.Class.forName的作用
Class.forName用於加載指定的JDBC驅動類
Class.forName本質是通知JDBC註冊這個驅動類
驅動由數據庫廠商自行開發,連接字符串也不同
5.Connection對象
Connection對象用於JDBC與數據庫的網絡通信對象
java.sql.Connection是一個接口,具體由驅動廠商實現
所有數據庫的操作都建立在Connection基礎上
6.連接數據庫的常見問題
ClassNotFoundException - 類未找到異常
Connection refuse - 數據庫連接被拒絕異常
Access denied for user - 用户名與密碼錯誤異常
7.Statement對象
Statement是用於執行SQL的工具
查詢方法: ResultSet executeQuery(String sql)
sql參數必須是SELECT 查詢SQL語句
8.ResultSet對象
ResultSet結果集對象,保存查詢結果
ResultSet採用迭代方式逐行獲取每一行表數據
每一次迭代,使用ResultSet對象的getXXX()方法獲取列數據。
9.事務:是以一種可靠的、一致的方式,訪問和操作數據庫的程序單元。
9.1事務的操作
開啓事務:start transaction;
回滾:rollback;
提交:commit;
9.2 MySQL數據庫的事務提交
1)事務提交的兩種方式
自動提交:MySQL數據庫默認是自動提交的,一條DML(增刪改語句)會自動提交一次事務;
手動提交:需要先開啓事務(START TRANSACTION),提交(COMMIT);
2)修改事務的默認提交方式
查看默認提交方式:SELECT @@autocommit; -- 1代表自動提交,0代表手動提交
修改默認提交方式:SET @@autocommit = 0; -- 1代表自動提交,0代表手動提交
9.3 事務回滾
如果事務中的某個點發生故障,則所有更新都可以回滾到事務開始之前的狀態。
如果沒有發生故障,則通過以完成狀態提交事務來完成更新。
回答問題:
一.JDBC的DriverManager是用來做什麼的?
DriverManager 是 Java JDBC API 的一部分,是用於管理數據庫驅動程序的類。它的主要功能包括:
1.註冊數據庫驅動程序:在使用 JDBC 連接數據庫之前,必須先註冊適用於數據庫的驅動程序。DriverManager 負責加載和註冊這些驅動程序。
2.創建數據庫連接:DriverManager 允許創建到數據庫的連接,這是執行 SQL 操作的第一步。
3.管理數據庫連接池:連接池是一組預先創建的數據庫連接,可以在需要時被重複使用,以提高性能。DriverManager 可以與連接池一起使用。
二.execute,executeQuery,executeUpdate的區別是什麼?
Statement 接口提供了三種執行 SQL 語句的方法:executeQuery、executeUpdate 和 execute。使用哪一個方法由 SQL 語句所產生的內容決定。
1.方法executeQuery
用於產生單個結果集的語句, 被使用最多的執行 SQL 語句的方法是 executeQuery。這個方法被用來執行 SELECT 語句
2.方法executeUpdate
用於執行 INSERT、UPDATE 或 DELETE 語句以及 SQL DDL(數據定義語言)語句,例如 CREATE TABLE 和 DROP TABLE
3.方法execute:
用於執行返回多個結果集、多個更新計數或二者組合的語句。
4.execute方法應該僅在語句能返回多個ResultSet對象、多個更新計數或ResultSet對象與更新計數的組合時使用
三.插入自動增長的主鍵會報錯嗎?
可能會遇到數據庫插入操作失敗的問題。 這通常是由於插入的數據中沒有為自動增長主鍵字段提供值所致。 解決這個問題的方法是確保在插入數據時,不需要為自動增長的主鍵字段提供值。
四.不指定列名插入會報錯嗎,應遵循什麼原則?
不指定列名插入數據時,通常不會直接報錯,但是可能會引發其他問題。由於這種方式高度依賴於表中列的定義次序和可獲得的次序信息,因此如果插入的順序與表中的列定義順序不匹配,可能會導致數據插入錯誤或者數據讀取錯誤。
為了確保數據插入的正確性和完整性,建議遵循以下原則:
1.指定列名插入:在插入數據時,最好明確指定列名,以確保數據按照正確的順序插入到正確的列中。這樣可以避免由於順序不匹配而導致的數據錯誤。
2.保持列順序一致性:如果必須在不指定列名的情況下插入數據,那麼應該儘量保持插入數據的順序與表中列的定義順序一致。這樣可以減少由於順序不匹配而引發的問題。
3.避免使用不安全的方式:不指定列名是一種相對不安全的方式,因為它高度依賴於表中列的定義次序和可獲得的次序信息。
五.如何防止數據庫注入?
SQL注入是一種web安全漏洞,使攻擊者干擾應用程序對其數據庫的查詢,使攻擊者可以查看到他們無法檢索的數據。
防止SQL注入的最佳做法是使用參數化查詢或預編譯語句
參數化查詢:PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?"); statement.setString(1, input); ResultSet resultSet = statement.executeQuery();
這是防止SQL注入的最有效方法。參數化查詢確保所有數據都被當作數據對待,而不是可執行的SQL代碼。在大多數現代數據庫訪問框架中,都支持參數化查詢。
預編譯語句的工作原理是將佔位符代替參數值發送給數據庫,數據庫會確保輸入參數被正確處理,並將其視為純粹的數據而不是可執行的SQL代碼。