29.06.2013 Views

Java 程式設計基礎班(10) - 網路資料庫實驗室

Java 程式設計基礎班(10) - 網路資料庫實驗室

Java 程式設計基礎班(10) - 網路資料庫實驗室

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!