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