1.通過接口可以實現不相關的類的相同行為.
2.通過接口可以指明多個類需要實現的方法.
3.通過接口可以了解對象的交互方法而不需要了解對象所對應的類藍本.
一個普通數據庫的連結過程為:
1.加載驅動程序.
2.通過DriverManager到得一個與數據庫連結的句柄.
3.通過連結句柄綁定要執行的語句.
4.接收執行結果.
5.可選的對結果的處理.
6.必要的關閉和數據庫的連結.
Class.forName方法是先在內存中溶解簽名為"org.gjt.mm.mysql.Driver"的Driver類,Driver類就會把相應的實現類對應到JDBC API的接口中.注冊驅動程序有多方法,Class.forName();是一種顯式地加載.當一個驅動程序類被Classloader裝載后,在溶解的過程中,DriverManager會注冊這個驅動類的實例.這個調用是自動發生的,也就是說DriverManager.registerDriver()方法被自動調用了
在成功注冊驅動程序后,我們就可以用DriverManager的靜態方法getConnection來得到和數據庫連結的引用:
Connection conn = DriverManager.getConnection(url);
如果連結是成功的,則返回Connection對象conn,如果為null或拋出異常,則說明沒有
和數據庫建立連結.
如果我們要對數據庫中的表進行操作,要先緣故綁定一個語句:
Statement stmt = conn.createStatement();
然后利用這個語句來執行操作.根本操作目的,可以有兩種結果返回,如果執行的查詢
操作,返回為結果集ResultSet,如果執行更新操作,則返回操作的記錄數int.
注意,SQL操作嚴格區分只有兩個,一種就是讀操作(查詢操作),另一種就是寫操作(更
新操作),所以,create,insert,update,drop,delete等對數據有改寫行為的操作都是更新操作.
關于Statement對象:
前面說過,Statement對象是用來綁定要執行的操作的,在它上面有三種執行方法:即用來執行查詢操作的executeQuery(),用來執行更新操作的executeUpdate()和用來執行動態的未知的操作的execute().一個Statement對象同時只能有一個結果集在活動.這是寬容性的,就是說即使沒有調用ResultSet的close()方法,只要打開第二個結果集就隱含著對上一個結果集的關閉.所以如果你想同時對多個結果集操作,就要創建多個Statement對象,如果不需要同時操作,那么可以在一個Statement對象上須序操作多個結果集
Statement的兩個子類:
PreparedStatement:對于同一條語句的多次執行,Statement每次都要把SQL語句發送給數據
庫,這樣做效率明顯不高,而如果數據庫支持預編譯,PreparedStatement可以先把要執行的語句一次發
給它,然后每次執行而不必發送相同的語句,效率當然提高
PreparedStatement ps = conn.prepareStatement("select * from 表 where 字段=?");
ps.setString(1,參數);
ResultSet rs = ps.executeQuery();
CallableStatement:是PreparedStatement的子類,它只是用來執行存儲過程的.
CallableStatement sc = conn.prepareCall("{call query()}");
ResultSet rs = sc.executeQuery();
ResultSet對象實際維護的是一個二維指針,第一維是指向當前行,最初它指向的是結果集的第一行之前,所以如果要訪問第一行,就要先next(),以后每一行都要先next()才能訪問,然后第二維的指針指向列,只要當你去rs.getXXX(列)時,才通過Connection再去數據庫把真實的數據取出來,否則沒有什么機器能真的把要取的數據都放在內存中.
如果有記錄又不知道是多少行,這時如果要對有記錄和沒有記錄進行不同的處理,應該用以下流程進行判斷:
if(rs.next()){
//因為已經先next()了,所經對記錄應該用do{}while();來處理
do{
int i = rs.getInt(1);
String a = rs.getString("a2");
}while(rs.next());
}
esle{
System.out.println("沒有取得符合條件的記錄!");
}
獲取結果集的信息:
大多數情況下編程人員對數據庫結構是了解的,可以知道結果集中各列的情況,但有時并
不知道結果集中有哪些列,是什么類型.這時可以通過getMetaData()來獲取結果集的情況:
ResulSetMetaData rsmd = rs.getMetaData();
rsmd.getColumnCount()返回列的個數.
getColumnLabel(int)返回該int所對應的列的顯示標題
getColumnName(int)返回該int所對應的列的在數據庫中的名稱.
getColumnType(int)返回該int所對應的列的在數據庫中的數據類型.
getColumnTypeName(int)返回該int所對應的列的數據類型在數據源中的名稱.
isReadOnly(int)返回該int所對應的列是否只讀.
isNullable(int)返回該int所對應的列是否可以為空
posted @ 2005-10-21 16:57 大雄 閱讀(184) | 評論 (0) | 編輯 收藏