小馬哥的 Java 項目實戰營《極客》

小馬哥的 Java 項目實戰營

小馬哥的 Java 項目實戰營java

第二節:數據存儲之 JDBCV(cmL46679910)

image.png

JDBC 核心 API


數據源sql

接口 - javax.sql.DataSource
獲取方式數據庫


一、普通對象初始化
1)Spring Bean
2)API 實現編程

二、JNDI 依賴查找markdown


主流 DataSource 實現app

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

image.png

二、對象池的概念oop

1)「池」化 - 「肉少狼多」,「肉」就是資源,「狼」就是「消
費者」
2)特色:有借有還
3)核心編程思想:生產者/消費者模型
4)資源:線程資源、數據庫資源、I/O 資源
5)舉例:線程池、數據庫鏈接池優化


三、C3P0(字節碼提高/優化)
四、Alibaba Druid(字節碼提高/優化)ui


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 實例

  1. 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 語句

一、DML 語句 :CRUD
R:java.sql.Statement#executeQuery
CUD:

java.sql.Statement#executeUpdate(java.lang.String)

二、DDL 語句
java.sql.Statement#execute(java.lang.String)
1)成功的話,不須要返回值(返回值 false)
2)失敗的話,SQLException*


SQL 執行結果接口 - java.sql.ResultSet
ResultSet 元數據接口 -
java.sql.ResultSetMetaData

列的個數、名稱以及類型等*


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

一、幾乎全部的 JDBC API 操做都須要 try catch java.sql.SQLException

二、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)
一、N 個 DataSources
二、DataSource 代理
1)Druid


MyBatis


MyBatis Generator 經過數據庫表結構生成 Java 代碼和 SQL
Mapper


JPA


相關資料


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

*做業
要求
一、經過自研 Web MVC 框架實現(能夠本身實現)一個用戶註冊,forward 到一個成功的頁面(JSP 用法)
1)/register
二、經過 Controller -> Service -> Repository 實現(數據庫實現)

三、(非必須)JDNI 的方式獲取數據庫源(DataSource),在獲取 Connection

四、經過 GraalVM 將一個簡單 Spring Boot 工程構建爲 Native Image,要求: 代碼要本身手寫 @Controller @RequestMapping("/helloworld") 相關插件能夠參考 Spring Native Samples (可選) 理解 Hint 註解的使用

相關文章
相關標籤/搜索