JDBC
- JDBC 是一個規範,它提供了一整套接口,允許底層資料庫實作該 API 進而實作通過 Java 對資料庫的通路,主要有以下幾個類:
- DriverManager:管理資料庫驅動程式,用于建立資料庫連接配接
- Drivrer:此接口處理與資料庫伺服器的通信,但很少我們會直接與 Driver 對象進行互動,會使用 DriverManager 對象來管理這種類
- Connection:此接口具有用于聯系資料庫的所有方法,是一個會話對象
- Statement:此接口建立 SQL 語句送出到資料庫
- ResultSet:使用 Statement 對象執行 SQL 查詢後,該對象儲存從資料檢索的資料
- SQLException:處理資料庫應用程式中發生的任何錯誤
注冊JDBC驅動方式
- Class.forName()
- DriverManager.registerDriver()
- System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”)
Statement、PreparedStatement、CallableStatement
Statement
- 用于對資料庫進行通用通路,不能接受參數,每次執行時都會執行一次執行計劃,存在 SQL 注入
PreparedStatement
- 繼承自 Statement ,預編譯 SQL 語句,可以修改參數,批量處理執行時隻執行一次執行計劃,可以防止 SQL 注入。
- PreparedStatement 并不能完全防止 SQL 注入,如它不會轉譯 % 符,當我們用 LIKE 語句時,使用者輸入的 % 會 SQL 語句原意,它會消耗系統資源,進而演化成拒絕服務攻擊。解決辦法可以直接禁止使用者輸入%,或過濾掉%
CallableStatement
- 用于執行存儲過程SQL語句,繼承自 PreaparedStatement
ResultSet
- 在通過 Connection 擷取 Statement 前可以設定 ResultSet 類型
- RSType 可選值
類型 | 描述 |
ResultSet.TYPE_FORWARD_ONLY | 光标隻能在結果集中向前移動 |
ResultSet.TYPE_SCROLL_INSENSITIVE | 光标可以向前向後滾動,結果集對建立結果集後發生的資料庫所做的更改不敏感 |
ResultSet.TYPE_SCROLL_SENSITIVE | 光标可以向前向後滾動,結果集對建立結果集後發生的資料庫所做的更改敏感 |
類型 | 描述 |
ResultSet.CONCUR_READ_ONLY | 預設值,結果集隻讀 |
ResultSet.CONCUR_UPDATABLE | 可更新的結果集,可以通過updateString... 等方法更改目前行結果集的值,但不會直接更新到資料庫,可以通過 cancelRowUpdates 取消對目前行的修改,或通過 updateRow 将更新送出到資料庫 |
JDBC事務
- JDBC預設是開啟自動送出模式的(無事務),通過設定 setAutoCommit(false) 關閉自動送出,完成更改後手動調用 commit 送出,使用 rollback 復原更新
- JDBC3.0 添加了 Savepoint 接口提供額外的事務控制能力,通過設定儲存點(Savepoint)可以在事務中定義邏輯復原點,發生錯誤時可以選擇復原到全部或者僅儲存儲存點之前的内容
- 通過 Connection 對象的 setSavepoint 設定儲存點,它傳回一個 SavePoint 對象
- releaseSavepoint 删除一個儲存點,傳入一個 SavePoint 對象
批處理
- 批量處理允許将相關的 SQL 語句分組到批進行中,并通過對資料庫的一次調用來送出它們,一次執行完成與資料庫之間的互動,一次向資料庫發送多個 SQL 語句時,可以減少通信開銷,進而提高性能
- Statement,PreparedStatement 和 CallableStatement 的 addBatch() 方法用于将單個語句添加到批處理
- executeBatch() 用于執行組成批量的所有語句
JDBC 文本跟二進制檔案處理
- 在對 BLOB、CLOB 等字段進行操作時,JDBC 可以使用輸入流作為 SQL 語句的輸入參數,設定輸入流方法有三個:
- setAsciiStream()
- setUnicodeStream()
- setBinaryStream()
資料庫連接配接池
概念
- 用池來管理 Connection,使得可以重複使用 Connection
- 有了池,我們不用自己建立 Connection,通過資料庫連接配接池來擷取 Connection
- 當 Connection 用完後,調用 close() 方法也不會真的關閉 Connection,而是把 Connection “歸還”給池,池可以再利用這個 Connection
- 如果不使用連接配接池,每次與資料庫會話都要産生一個 Connection,極大的消耗資源
資料庫連接配接池接口
- Java 為資料庫連接配接池提供了公共接口:javax.sql.DataSource,各大廠商可以讓自己的連接配接池實作該接口,而應用程式可以友善的切換不同的連接配接池。
DBCP 與 C3P0
- DBCP 是 apache 實作的一個連接配接池,也是 Spring 官方推薦的
- C3P0 是 hibernate 官方推薦的
轉載于:https://my.oschina.net/LinYuanBaoBao/blog/1612976