Java 程式設計基礎班(10) - 網路資料庫實驗室
Java 程式設計基礎班(10) - 網路資料庫實驗室
Java 程式設計基礎班(10) - 網路資料庫實驗室
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Java</strong> 程式設計<br />
基礎班 (<strong>10</strong>)<br />
劉根豪<br />
台大電機所網路資料庫研究室<br />
Class <strong>10</strong> 1<br />
回顧<br />
<strong>Java</strong> Applet<br />
Class <strong>10</strong><br />
Email: kenliu@arbor.ee.ntu.edu.tw<br />
2<br />
1
Database & JDBC<br />
為什麼使用資料庫?<br />
JDBC 簡介<br />
Access 使用<br />
資料庫連結<br />
資料取得<br />
Class <strong>10</strong><br />
為什麼使用資料庫?<br />
對大量的資料處理與維護較容易,相對於檔<br />
案儲存方式<br />
File對資料的表現方式,比較缺乏.例如:報表<br />
Class <strong>10</strong><br />
3<br />
4<br />
2
為什麼使用資料庫?<br />
Class <strong>10</strong><br />
為什麼使用資料庫?<br />
幾個主要的database<br />
Oracle<br />
Microsoft SQL server<br />
IBM DB2<br />
MySQL (Free)<br />
PostgreSQL (Free)<br />
Sybase<br />
Access<br />
Class <strong>10</strong><br />
5<br />
6<br />
3
JDBC簡介<br />
<strong>Java</strong> Database Connectivity<br />
為使使用資料庫方便的函式API<br />
可透過JDBC API對資料庫直接下達SQL指<br />
令作資料的運算<br />
並可操作資料庫中的資料<br />
Class <strong>10</strong><br />
JDBC 版本<br />
JDBC 1.0 vs JDBC 2.0<br />
資料集內可以指定移動的游標筆數<br />
可以使用<strong>Java</strong>指令來更新資料來替代使用<br />
SQL指令<br />
可以一次下達多個SQL指令<br />
支援SQL3的資料型態<br />
Class <strong>10</strong><br />
7<br />
8<br />
4
JDBC 版本<br />
Class <strong>10</strong><br />
JDBC的種類<br />
1. JDBC-ODBC橋接驅動程式 (JDBC-ODBC<br />
bridge)<br />
2. 原生API驅動程式 (Native-API Driver)<br />
3. JDBC透過網路存取的pure <strong>Java</strong>驅動程式<br />
4. 原生協定與pure <strong>Java</strong>驅動程式<br />
Class <strong>10</strong><br />
9<br />
<strong>10</strong><br />
5
TYPE 1<br />
Sun Microsystems在JDK中就含有JDBC-<br />
ODBC橋接驅動程式,用來存取ODBC資料來<br />
源。<br />
Class <strong>10</strong><br />
TYPE 2<br />
<strong>Java</strong> AP<br />
JDBC<br />
API<br />
JDBC-ODBC<br />
Bridge<br />
ODBC<br />
API<br />
DB<br />
ODBC Layer<br />
使用非<strong>Java</strong>程式撰寫的資料庫驅動程式,<br />
提供JDBC和資料庫之間的溝通介面。<br />
Class <strong>10</strong><br />
<strong>Java</strong> AP<br />
JDBC<br />
API<br />
JDBC Driver<br />
Vender<br />
SPEC. API<br />
DB<br />
11<br />
12<br />
6
TYPE 3<br />
應用在三層式架構的驅動程式。<br />
Class <strong>10</strong><br />
TYPE 4<br />
<strong>Java</strong> AP<br />
JDBC<br />
API<br />
JDBC Driver<br />
JDBC DR<br />
Server<br />
DB<br />
Native Driver<br />
由<strong>Java</strong>寫成的資料庫驅動程式,直接與資<br />
料庫溝通,是效能最好的一種<br />
Class <strong>10</strong><br />
<strong>Java</strong> AP<br />
JDBC<br />
API<br />
JDBC Driver<br />
DB<br />
13<br />
14<br />
7
JDBC的種類<br />
並非所有的JDBC driver都有提供這四種不<br />
同的type,一般來說,typ2是最適合的<br />
solution (多數為free,效率可被接受)<br />
Class <strong>10</strong><br />
Access 資料庫使用<br />
資料庫建立<br />
資料表建立與欄位設定<br />
輸入資料<br />
Class <strong>10</strong><br />
15<br />
16<br />
8
資料庫建立<br />
建立新的資料庫<br />
開啟舊的資料庫<br />
Class <strong>10</strong><br />
資料表建立與欄位設定<br />
資料表新增<br />
欄位新增與設定<br />
欄位修改與刪除<br />
Class <strong>10</strong><br />
17<br />
18<br />
9
資料表建立<br />
Class <strong>10</strong><br />
欄位設定<br />
Class <strong>10</strong><br />
19<br />
20<br />
<strong>10</strong>
ODBC資料庫連結<br />
利用windows的ODBC設定<br />
為TYPE 1 JDBC<br />
建立ODBC資料來源<br />
“控制台”中的“ODBC設定”<br />
Class <strong>10</strong><br />
建立ODBC資料來源<br />
進入Windows控制台內的“ODBC資料來源<br />
(32bit)”<br />
Winxp:控制台系統管理工具資料來源 (ODBC)<br />
建立新資料來源,選擇Microsoft access<br />
Driver(*.mdb)選項<br />
進入ODBC Microsoft Access 設定對話盒,<br />
完成“資料來源名稱”與“敘述”欄位<br />
Class <strong>10</strong><br />
21<br />
22<br />
11
建立ODBC範例<br />
Class <strong>10</strong><br />
建立ODBC範例<br />
Class <strong>10</strong><br />
23<br />
24<br />
12
建立ODBC範例<br />
Class <strong>10</strong><br />
ODBC資料來源的建立與關閉<br />
1. import java.sql.*<br />
Class <strong>10</strong><br />
Class.forName 載入驅動程式<br />
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”)<br />
2. 連線:Connection<br />
Con=DriverManager.getConnextion(“jdbc:odb<br />
c:ODBC資料來源名稱”,“使用者帳號”,“密碼”)<br />
3. 關閉:Connection 物件變數.close();<br />
25<br />
26<br />
13
從資料庫取得資料<br />
記錄集的觀念<br />
從資料來源取得資料<br />
取得記錄集中的欄位與欄位名稱<br />
紀錄指標位置的設定/取得與紀錄筆數<br />
以分頁方式檢視記錄集<br />
Class <strong>10</strong><br />
記錄集<br />
透過資料連結,執行SQL指令進行資料的查<br />
詢時,所回傳的查詢結果稱為記錄集<br />
(RecordSet)<br />
虛擬的資料工作表<br />
JDBC中使用來儲存記錄集的是ResultSet<br />
Class <strong>10</strong><br />
27<br />
28<br />
14
記錄集指標<br />
一次只能存取一筆資料<br />
Class <strong>10</strong><br />
從資料來源取得資料<br />
1. 建立Statement<br />
2. 執行查詢動作<br />
3. 取得欄位資料<br />
4. 利用迴圈取得記錄集中的所有資料<br />
5. ResultSet物件與Statement物件的關閉<br />
Class <strong>10</strong><br />
29<br />
30<br />
15
建立Statement<br />
Statement 物件變數=Connection 物件變<br />
數.createStatement()<br />
記錄集指標只能向前移動且不能修改<br />
Statement 物件變數=Connection 物件變<br />
數.createStatement(int 游標型態,int 資料一<br />
致性)<br />
Class <strong>10</strong><br />
建立Statement<br />
指標型態<br />
Class <strong>10</strong><br />
TYPE_FORWARD_ONLY<br />
The constant indicating the type for a ResultSet object whose<br />
cursor may move only forward.<br />
TYPE_SCROLL_SENSITIVE<br />
The constant indicating the type for a ResultSet object that is<br />
scrollable and generally sensitive to changes made by others.<br />
TYPE_SCROLL_INSENSITIVE<br />
The constant indicating the type for a ResultSet object that is<br />
scrollable but generally not sensitive to changes made by<br />
others.<br />
31<br />
32<br />
16
建立Statement<br />
資料一致性<br />
Class <strong>10</strong><br />
CONCUR_READ_ONLY<br />
The constant indicating the concurrency mode for<br />
a ResultSet object that may NOT be updated.<br />
CONCUR_UPDATEABLE<br />
The constant indicating the concurrency mode for<br />
a ResultSet object that may be updated.<br />
建立Statement<br />
一個Statement只能建立一個ResultSet<br />
如果使用Statement來產生新的ResultSet,<br />
之前產生的ResultSet將會被關閉<br />
Class <strong>10</strong><br />
33<br />
34<br />
17
執行查詢動作<br />
ResultSet 物件變數=<br />
Statemet物件變數.executeQuery(String<br />
SQL敘述)<br />
Class <strong>10</strong><br />
取得欄位資料<br />
根據欄位型態的不同使用不同的型態功能取得資<br />
料<br />
ResultSet 物件變數.getXXX(欄位變數);<br />
ResultSet 物件變數.getXXX(欄位索引);<br />
getString<br />
getBoolean<br />
getByte<br />
getBytes<br />
getDate<br />
getDouble<br />
getFloat<br />
getInt<br />
getLong<br />
Class <strong>10</strong><br />
getTime<br />
35<br />
36<br />
18
取得欄位資料<br />
利用ResultSet物件中的getMetaData(),可<br />
以拿到一個ResultSetMetaData,裡面會記<br />
錄一些這個ResultSet的基本資料<br />
getColumnCount() 共多少個column<br />
getColumnName(index) column的名稱<br />
Class <strong>10</strong><br />
利用迴圈取得記錄集所有資料<br />
移動指標<br />
Class <strong>10</strong><br />
fist()<br />
next()<br />
previous()<br />
afterlast()<br />
absolute()<br />
判斷指標<br />
isFirst()<br />
isLast()<br />
isAfterLast()<br />
isBeforeFirst()<br />
37<br />
38<br />
19
ResultSet物件與Statement物的關閉<br />
ResultSet物件.close<br />
Statement物件.close<br />
Class <strong>10</strong><br />
紀錄指標位置的設定/取得與紀錄<br />
筆數<br />
取得<br />
Class <strong>10</strong><br />
getRow<br />
設定<br />
absolute(int 記錄位置)<br />
記錄筆數取得<br />
移到最後一筆,取得記錄位置last,getRow()<br />
39<br />
40<br />
20