天天看點

JDBC 與 資料庫連接配接池

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 光标可以向前向後滾動,結果集對建立結果集後發生的資料庫所做的更改敏感
  • RSConcurrency 可選值
類型 描述
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