【Java】JDBC詳解

雨下一整晚real發表於2020-12-02

JDBC

JDBC概念

概念:Java Database Connectivity Java資料庫連線 ,Java語言運算元據庫

JDBC本質:是官方定義的一套操作所有關係型資料庫的規則,即介面。各個資料庫廠商去實現這套介面,提供資料庫驅動jar包。我們可以使用這套介面程式設計,真正執行的程式碼是驅動jar包中的實現類。

使用步驟

image-20201129235901149

匯入jar包詳細步驟

  • 將需要匯入的Jar包複製新增進Project下的libs資料夾中
  • 選中jar包檔案,新增為libs
    • 選擇Add As Libraries

物件詳解

image-20201130000142554

image-20201130001641319

image-20201130001944783

image-20201130002826698

image-20201130002645714

實際運用

image-20201130003820493

image-20201130003908208

判斷是否有資料,看結果集下一行是否存在。

image-20201130221507014

結果集ResultSet

image-20201130221604599

寫工具類獲取路徑URL和String值

image-20201130232513386

工具類

image-20201130232622444

工具類實現

image-20201201191930905

image-20201201192025199

image-20201201192135749

image-20201201192230797

image-20201201192254501

重複的部分框架結構

練習

image-20201201192938604

需求分析改進

image-20201201193923458

練習實現程式碼

image-20201201193603849

image-20201201193704094

image-20201201193745250

注意問題

SQL隱碼攻擊問題

在使用一些SQL語句的時候,會因為一些語句注入不符合開發者原意,繞過SQL驗證的機制,產生安全隱患的問題。

需要使用到PreparedStatement,預編譯的SQL語句。

步驟如下:
image-20201201200229541

image-20201201200604375

JDBC處理事務

簡單邏輯的事務管理

image-20201201202937036

image-20201201203011641

image-20201201203115376

但是這些程式碼在執行的時候,如果出現錯誤,可能導致事務並沒有完全執行。體現在實際的場景中的時候,可能是張三的餘額減掉了而李四的錢卻沒有加上,導致出現安全事故。

這個時候需要做出更加安全有效的措施。

執行的操作是需要加上**【事務回滾】**,在抓取異常的部分【catch】中,抓取所有可能發生的異常,用Exception e接受異常,在異常抓取塊中,進行事務回滾的判斷【若執行物件不為null,則進行事務回滾】,並同時抓取事務回滾可能產生的異常【SQLException e1】,異常中簡單處理,輸出e1.printStackTrace();

改進之後的程式碼【部分】

image-20201201203956988

  • 出現異常,抓取事務

image-20201201204049244

  • 抓取異常,異常處理

image-20201201204155956

事務管理

image-20201201220440329

資料庫連線池

image-20201201222208963

為了簡化程式碼,方便開發,我們需要引入資料庫連線池和**【Spring JDBC Template】**。

根據之前的邏輯進行開發的話,申請的物件頻繁使用後釋放,會造成運算資源等的浪費,也會造成程式碼的繁冗(但是優點是不會造成記憶體的長期佔用),導致開發難度加大。

在這種情況下,我們引進資料庫連線池的概念。

資料庫連線池就是相當於一個容器,將可能會用到的資料庫連線物件存放在這個容器中,稱之為資料庫連線池。

使用完連線物件之後,將物件歸還到資料庫連線池中,不會被釋放掉。同時申請使用物件的時候也簡化了很多。使用資料庫連線池優點是:

  • 訪問速度變快
  • 節約系統資源
  • 連線利用率提高

檢視標準開發文件中的資料,DataSource【位於javax.sql中】的詳細介紹。

image-20201201222423820

知識點

image-20201201222937587

資料庫連線池的實現

image-20201201223220890

C3P0—資料庫連線池的實現

image-20201201225103675

注意事項

  • 配置檔名字為指定的值時,會自動載入配置檔案
  • 不要忘記匯入資料庫驅動jar包
  • 通過建立核心物件——資料庫連線物件來使用(區別於後面的Druid資料庫連線池)

Druid—資料庫連線池的實現

使用步驟

image-20201201231029252

注意事項

  • 使用的時候不需要指定配置檔名,需要自己手動載入使用
  • 配置檔案是properties形式的檔案
    • 在src檔案下new一個file,命名為XXX.properties
    • 在source格式下新增名值對的方式注意事項:
      • 名用大寫比較規範
      • 【=】符號兩邊別打空格
      • 名值對寫完後別加分號
  • 使用時候需要建立資料庫連線池物件,通過工廠DruidDataSourceFactory】來獲取

部分實現程式碼

image-20201201230857102

其中,InputStream是用來接收配置檔案的輸入字元。

建立Druid連線池的工具類

為了方便Druid的資料庫連線池的使用,建立工具類物件。

實現程式碼

image-20201201231940413

image-20201201232024809

image-20201201232124975

釋放資源的時候需要進行過載,但是發現程式碼塊中有重複的部分。可以在引數少的方法中直接返回多個引數的方法,並將沒有的引數賦值為空,if判斷不滿足,跳過即可。

這樣的編碼大大精簡了程式碼的長度。

image-20201201232336741

具體的體現就是將這個方法中的rs傳值null,返回給上面少引數的方法當成返回值。但要注意編碼的順序

image-20201201232539451

表現為這段程式碼,直接呼叫三引數的方法,將第一個引數賦值為空,結果作為返回值即可。

最後一個階段,獲取連線池方法。

image-20201201232755117

Druid工具類呼叫

實現程式碼

image-20201201233305489

image-20201201233356713

Spring JdbcTemplate

概念 Spring JDBCSpring框架對於JDBC實現的一個封裝。

使用步驟

image-20201201235226984

使用前準備

匯入jar包:

IOC需要的jar包:

commons-logging-1.1.3.jar
      spring-aop-4.0.0.RELEASE.jar //註解會使用到的包
      spring-beans-4.0.0.RELEASE.jar
      spring-context-4.0.0.RELEASE.jar
      spring-core-4.0.0.RELEASE.jar
      spring-expression-4.0.0.RELEASE.jar

MySQL驅動包、c3p0jar包:

c3p0-0.9.1.2.jar
      mysql-connector-java-5.1.37-bin.jar

JdbcTemplate需要的jar包:

spring-jdbc-4.0.0.RELEASE.jar
      spring-orm-4.0.0.RELEASE.jar
      spring-tx-4.0.0.RELEASE.jar

注:上面的可能因為版本差異,有所區別,教學視訊中以下為準。

實際上應用時匯入的jar包有:

image-20201201234049968

實現程式碼

image-20201201234914942

實際上使用JDBC temple時,只需要呼叫template之後就可以了,其餘的操作(歸還連線物件,釋放物件,異常處理等)不需要我們再手動完成,封裝的包會自己完成這些操作,大大簡化了使用的步驟。

練習內容

image-20201201235501159

實現步驟

用單元測試程式碼,實時測試是否執行成功這些語句。

實現程式碼

image-20201202000047931

image-20201202000940496

image-20201202001132326

image-20201202001508189

上面這段是正確的程式碼,如果傳入兩個返回結果,將會報錯。因為一次只能傳入條記錄,查詢的結果集長度只能為1,將列名作為key,將值作為value。【鍵值對】

image-20201202001753642

上面的程式碼返回了兩個欄位集合,將會報錯

如果要查詢多條記錄並返回,應該返回的是List集合,程式碼如下。

image-20201202002033234

這次的返回時候,是將作為List的單個值,返回一個的集合List。

下面的程式碼是原來的老方法,並沒有直接呼叫Spring框架中提供的方法,程式碼冗餘度高

image-20201202002559578

image-20201202002646881

下面的程式碼呼叫了Spring框架中的封裝的方法,程式碼比較簡答,但是在進行傳參的時候,需要將原始碼複製過來,修改其中的封裝的方法中的private 返回值型別 全部改成對應的實現類,如將 int 改成 Integer ,double 改成 Double;之後更改Getter和Setter方法,重新返回的toString方法。

image-20201202003343179

最後一個階段,返回查詢總記錄數。

image-20201202003534490

Spring JdbcTemplate中使用的方法

image-20201202003737295

根據B站視訊學習總結過來,如有紕漏,敬請指出。

視訊地址:java高階課程 JDBC【黑馬】idea

相關文章