1. 程式人生 > 其它 >小馬哥的 Java 專案實戰營學習筆記(1)

小馬哥的 Java 專案實戰營學習筆記(1)

小馬哥的 Java 專案實戰營

小馬哥的 Java 專案實戰營

第二節:資料儲存之 JDBC

JDBC 核心 API


資料來源

介面 - javax.sql.DataSource
獲取方式


1、普通物件初始化
1)Spring Bean
2)API 實現

2、JNDI 依賴查詢


主流 DataSource 實現

1、Apache DBCP 1/2
間接依賴 - Apache Commons Pool

2、物件池的概念

1)“池”化 - “肉少狼多”,“肉”就是資源,“狼”就是“消
費者”
2)特點:有借有還
3)核心程式設計思想:生產者/消費者模型
4)資源:執行緒資源、資料庫資源、I/O 資源
5)舉例:執行緒池、資料庫連線池


3、C3P0(位元組碼提升/優化)
4、Alibaba Druid(位元組碼提升/優化)


JDBC 驅動管理

驅動介面 - java.sql.Driver

驅動管理器介面 - java.sql.DriverManager

管理器角色

獲取 Driver 實現

前提:資料庫驅動 Driver 實現會顯示地呼叫
java.sql.DriverManager#registerDriver 方法

1)通過 ClassLoader 載入 Drvier 實現(使用者/應用控制)
2)通過 Java SPI ServiceLoader 獲取 Driver 實現
載入順序與 Class Path 的順序有關係

3)通過 “jdbc.drivers” 系統屬性


載入順序和屬性值的順序有關係


通過讀取“jdbc.drivers” 系統屬性後,再經過 ":" 的分割,嘗
試獲取多值,再通過 ClassLoader 載入對應的實現類


ServiceLoader 會初始化 Driver 實現類(應用主動配置),
包含 Class 載入。


獲取 Connection
通過 ClassLoader 類載入資料庫 JDBC Driver 實現類的方
式,增加 java.sql.DriverManager#registeredDrivers 欄位
的元素,然後通過迭代的方式逐一 嘗試 getConnection 方法
引數的 JDBC URL 是否可用。


問題集合
1)當多個 Driver 同時被載入到 ClassLoader 後,到底用了哪
個?
getConnection 方法是通過 JDBC URL 判斷的,通過迭代多
次,返回第一個成功的 Connection 例項
2) java.sql.DriverManager#loadInitialDrivers 方法中 Java
SPI 空便利的意義在哪裡?

try{
while(driversIterator.hasNext()) {
driversIterator.next();
}
} catch(Throwable t) {
// Do nothing
}

ServiceLoader#next() 方法會主動觸發 ClassLoader 加
載。


資料連線介面 - java.sql.Connection


相近語義術語


一個 JDBC Connection 相當於 MyBatis Session 或者
Hibernate Session


建立 SQL 命令 - Statement


SQL 命令介面 - java.sql.Statement

主要型別
1)普通 SQL 命令 - java.sql.Statement
2)預編譯 SQL 命令 - java.sql.PreparedStatement
3)儲存過程 SQL 命令 - java.sql.CallableStatement


DDL 語句和 DML 語句


1、DML 語句 :CRUD
R:java.sql.Statement#executeQuery
CUD:
java.sql.Statement#executeUpdate(java.lang.String)
2、DDL 語句
java.sql.Statement#execute(java.lang.String)
1)成功的話,不需要返回值(返回值 false)
2)失敗的話,SQLException


SQL 執行結果介面 - java.sql.ResultSet
ResultSet 元資料介面 -
java.sql.ResultSetMetaData


列的個數、名稱以及型別等


SQL 執行異常 - java.sql.SQLException
基本特點


1、幾乎所有的 JDBC API 操作都需要 try catch
java.sql.SQLException
2、java.sql.SQLException 屬於檢查型別異常,繼承
Exception
事務保護點介面 - java.sql.Savepoint


事務
I
NSERT(S) -> UPDATE(F) -> 回滾
INSERT(S) -> UPDATE(S) -> INSERT(F)
T1 T2
巢狀事務
T0 = T1 + T2
java.sql.Connection#setSavepoint(java.lang.String)
Savepoint t2 = connection.setSavepoint("T2");
t2.


關聯技術


Native SQL


資料來源(DataSource)


多資料庫源(Multiple DataSources)
1、N 個 DataSources
2、DataSource 代理
1)Druid


MyBatis


MyBatis Generator 通過資料庫表結構生成 Java 程式碼和 SQL
Mapper


JPA


相關資料


A -> B -> C -> D -> E
-> Exception -> E

作業
要求
1、通過自研 Web MVC 框架實現(可以自己實現)一個使用者
註冊,forward 到一個成功的頁面(JSP 用法)
1)/register
2、通過 Controller -> Service -> Repository 實現(資料庫實
現)
3、(非必須)JDNI 的方式獲取資料庫源(DataSource),
在獲取 Connection

4、通過 GraalVM 將一個簡單 Spring Boot 工程構建為 Native Image,要求:

程式碼要自己手寫 @Controller @RequestMapping("/helloworld")
相關外掛可以參考 Spring Native Samples
(可選) 理解 Hint 註解的使用