---
# System prepended metadata

title: JDBC
tags: [MySQL, Java]

---

# 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)