# JDBC重點整理
## JDBC幹嘛的?
應用程式與資料庫之間的橄欖枝,透過JDBC來跟資料庫溝通(CRUD,新查修刪)。
因為資料庫種類繁多,若要個別寫對應的程式碼,開發人員會哭死(我是JAVA小弟不是DBA大哥),所以乾脆由JAVA這邊先出規格、統一資料型別與方法命名,讓資料庫開發人員實作。
## 與JDBC有關的各個角色
* JAVA開發人員:<font color = red>定義規格、統一資料型別與方法命名</font>
* 系統提示:野生的JDBC標準API介面跳出來了!!
* 各家廠商:超爽ㄉ~~ 我只要去實做這個介面就好惹~~ (製作出各種driver的jar包)
* 使用者:我只要抓下來import就好了吼?
## JDBC API套件
* JDBC API已包含在JDK中
java.sql:核心API,基本功能
javax.sql:多一個x比較厲害,所以可以支援進階功能(x = Extension)
(合理懷疑docx、pptx等等也是同樣命名方式)
## JDBC Driver
因為各家廠商皆有實作其JDBC Driver,所以換資料庫的時候只要把對應新資料庫的Driver jar包import進來即可。
* 降低相依性
* 潮爽DER~~
### 四種JDBC Driver~~呼吸法~~
#### Type 1 Driver(Driver第一型)
* 名稱:JDBC-ODBC Bridge Driver
* 微軟拔刀相助
* 把JDBC運作轉成ODBC的機制來連接資料庫
* 存取數度與功能皆受限(微軟的陰謀?)
* 從JDK 8開始被移除
#### Type 2 Driver(Driver第二型)
* 名稱:Native API Driver
* 以「原生」方式呼叫資料庫提供的原生程式庫
* 速度比第一型快
* 須預先裝載資料庫所需之原生程式庫(所以沒做到跨平台)
#### Type 3 Driver(Driver第三型)
* 名稱:JDBC-Net Driver
* 在使用者與資料庫之間另外架一個server
* 透過特定的網路協定連線到server,透過server操作資料庫
* 彈性較佳
* 速度較慢(畢竟要透過server這個中繼站)
#### Type 4 Driver(Driver第四型)
* 名稱:Native Protocol Driver
* 通常由資料庫廠商提供(YA~)
* 完全透過Java技術實現,所以可以跨平台
* 為最常見的Driver類型
## java.sql內裝
interface系列:
1. Driver:各廠牌的JDBC Driver都要實作的接口,使用者下的指令能透過driver去執行。
2. Connection:所謂的「通道」或「連線」,操作資料庫的關鍵,代表跟資料庫的連線通道。
3. ResultSet:對應到SQL中select指令的結果操作。
4. Statement家族:
* Statement:藉由Connection方法來建立與取得Statement物件,執行靜態的SQL指令並與資料庫交談(Statement creatStatement()
### Statement vs. PreparedStatement
1. 效率:PreparedStatement的效率會比Statement好
```
Statement statement = conn.createStatement();
PreparedStatement preStatement = conn.prepareStatement(sql);
//執行的時候:
ResultSet rSet = statement.executeQuery(sql);
ResultSet pSet = preStatement.executeQuery();
```
在建立時,PreparedStatement有預編譯的過程,已經繫結sql,之後無論執行多少遍,都不會再去進行編譯;而 Statement不同,如果執行多次,則相應的就要編譯多少遍sql,所以從這點看,PreparedStatement 的效率會比Statement要高一些。
2. 安全:PreparedStatement比Statement安全
## boolean execute()
1. 有更新就是false;沒更新就是true。
2. 可以理解成「詢問資料前後是否一致?」若僅查詢沒有更新,資料前後自然一致,就是true;若有更動(新刪修),資料前後不一致,就是false。
## 交易ACID
* A:原子性(Atomicity)
<font color = red>關鍵:無法分割</font>
因為原子當時被當成最小單位,無法被分割(夸克表示:),用這個「無法分割」的特性來表達一個交易要內部所有步驟都成功,才能算交易成功;若其中一個步驟出包即失敗(有內鬼,終止交易)。
* C:一致性(Consistency)
<font color = red>關鍵:質量守恆</font>
交易作用的資料集合在交易前後必須一致,若交易成功,整個資料庫集合會是交易後的狀態;反之則為交易前狀態。(質量守恆定律)
舉例:甲有1000元,乙有100元,若甲匯給乙500元,則交易成功後甲有500元,乙有600元;交易失敗的話雙方的錢不會有更動,故不會出現乙莫名變成600元,但甲毫無損失,或是甲短少500元,乙卻啥都沒拿到的情形。
可以用會計來思考這個特性。
* I:隔離行為(Isolation behavior)
<font color = red>關鍵:你走你的陽關道,我過我的獨木橋</font>
在多執行續的情況下,每個人都能保有自己的交易,不會互相干擾。
* D:持續性(Durability)
<font color = red>關鍵:永恆不變</font>
交易一旦成功,所有變更都會保存下來,就像是匯款後錢就拿不回來一樣,即便系統出問題(eg.發現匯錯帳戶),匯款結果也不會變更。
## 批次更新