# JDBC
###### tags: `Java` `MySQL`
## 概論
* Java DataBase Connectivity API
* 讓 Java程式存取關聯式資料庫
* 以 Interface 為主
* 使用者更換RDBM時, 不用大幅修改原有程式
* 程式設計者無須深入了解DB結構即可串接
* 透過JDBC Driver 來實現連接各廠商的RDBMs
## Basic
* 註冊JDBC Driver
```
Class.forName("FULL_DRIVER_NAME")
```
* 基本用法
```
try(
Connection conn = DriverManager.getConnection(url,"USER_NAME","PASSWD");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SQL_STATEMENT"); ){
STATEMENTS
}catch(){}
```
## PreparedStatement介面
* 預先編譯: DB對SQL_STATEMENTS進行compile & cache
* 透過"?"指定參數所在位置
```
String SQL = "SELECT * FROM table_name WHERE col1=? AND col2=?"
```
* void setXXX(int paraIndex, XXX value) throws SQLException
* paraIndex: 指定?的位置, 由左至右, 從1開始
* value: 要加入資料表欄位的值
* 查詢用法
```
PreparedStatement pstmt = conn.prepareStatement(SQL);
pstmt.setXXX(paraIndex, value);
ResultSet rs = pstmt.excuteQuery();
```
* 更新資料用法
```
PreparedStatement pstmt = conn.prepareStatement(SQL);
pstmt.setXXX(paraIndex, value);
int count = pstmt.executeUpdate();s
```
## CallableStatement介面
* Stored procedure 事先編譯好, 以物件形式存在DB中
* 在資料庫編譯時即可確定有無語法錯誤
* 資料傳輸量小, 速度快
* 程式設計者只需知道 Stored procedure 跟所需參數, 不用會SQL指令
* CallableStatement
```
String SQL = "{call storeProcedureName(?s)}";
CallableStatement cstmt = conn.prepareCall(SQL);
cstmt.set(paraIndex, value)
cstmt.execute();
// If there are OutPuts
TYPE VAR = cstmt.getXXX(paraIndex);
```
## Blob & Clob
* BLOB (Binary Large Object): 用於儲存圖片、影像、聲音等物件
* CLOB (Character Large Object): 用於儲存文件等大型文字檔
## MetaData
## Batch Update
## Transaction
### [作業存放區](https://github.com/JenCHuang/JavaSt/tree/master/JDBC/HW)