JDBCTM 指南:入門5 - ResultSet
更新時(shí)間:2006年10月13日 00:00:00 作者:
5 - ResultSet
本概述是從《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》這本書中摘引來(lái)的。JavaSoft 目前正在準(zhǔn)備這本書。這是一本教程,同時(shí)也是 JDBC 的重要參考手冊(cè),它將作為 Java 系列的組成部份在 1997 年春季由 Addison-Wesley 出版公司出版。
5.1 概述
ResultSet 包含符合 SQL 語(yǔ)句中條件的所有行,并且它通過(guò)一套 get 方法(這些 get 方法可以訪問(wèn)當(dāng)前行中的不同列)提供了對(duì)這些行中數(shù)據(jù)的訪問(wèn)。ResultSet.next 方法用于移動(dòng)到 ResultSet 中的下一行,使下一行成為當(dāng)前行。
結(jié)果集一般是一個(gè)表,其中有查詢所返回的列標(biāo)題及相應(yīng)的值。例如,如果查詢?yōu)?SELECT a, b, c FROM Table1,則結(jié)果集將具有如下形式:
a b c
-------- --------- --------
12345 Cupertino CA
83472 Redmond WA
83492 Boston MA
下面的代碼段是執(zhí)行 SQL 語(yǔ)句的示例。該 SQL 語(yǔ)句將返回行集合,其中列 1 為 int,列 2 為 String,而列 3 則為字節(jié)數(shù)組:
java.sql.Statement stmt = conn.createStatement();
ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (r.next())
{
// 打印當(dāng)前行的值。
int i = r.getInt("a");
String s = r.getString("b");
float f = r.getFloat("c");
System.out.println("ROW = " + i + " " + s + " " + f);
}
5.1.1 行和光標(biāo)
ResultSet 維護(hù)指向其當(dāng)前數(shù)據(jù)行的光標(biāo)。每調(diào)用一次 next 方法,光標(biāo)向下移動(dòng)一行。最初它位于第一行之前,因此第一次調(diào)用 next 將把光標(biāo)置于第一行上,使它成為當(dāng)前行。隨著每次調(diào)用 next 導(dǎo)致光標(biāo)向下移動(dòng)一行,按照從上至下的次序獲取 ResultSet 行。
在 ResultSet 對(duì)象或其父輩 Statement 對(duì)象關(guān)閉之前,光標(biāo)一直保持有效。
在 SQL 中,結(jié)果表的光標(biāo)是有名字的。如果數(shù)據(jù)庫(kù)允許定位更新或定位刪除,則需要將光標(biāo)的名字作為參數(shù)提供給更新或刪除命令??赏ㄟ^(guò)調(diào)用方法 getCursorName 獲得光標(biāo)名。
注意:不是所有的 DBMS 都支持定位更新和刪除??墒褂?DatabaseMetaData.supportsPositionedDelete 和 supportsPositionedUpdate 方法來(lái)檢查特定連接是否支持這些操作。當(dāng)支持這些操作時(shí),DBMS/驅(qū)動(dòng)程序必須確保適當(dāng)鎖定選定行,以使定位更新不會(huì)導(dǎo)致更新異?;蚱渌l(fā)問(wèn)題。
5.1.2 列
方法 getXXX 提供了獲取當(dāng)前行中某列值的途徑。在每一行內(nèi),可按任何次序獲取列值。但為了保證可移植性,應(yīng)該從左至右獲取列值,并且一次性地讀取列值。
列名或列號(hào)可用于標(biāo)識(shí)要從中獲取數(shù)據(jù)的列。例如,如果 ResultSet 對(duì)象 rs 的第二列名為“title”,并將值存儲(chǔ)為字符串,則下列任一代碼將獲取存儲(chǔ)在該列中的值:
String s = rs.getString("title");
String s = rs.getString(2);
注意列是從左至右編號(hào)的,并且從列 1 開始。同時(shí),用作 getXXX 方法的輸入的列名不區(qū)分大小寫。
提供使用列名這個(gè)選項(xiàng)的目的是為了讓在查詢中指定列名的用戶可使用相同的名字作為 getXXX 方法的參數(shù)。另一方面,如果 select 語(yǔ)句未指定列名(例如在“select * from table1”中或列是導(dǎo)出的時(shí)),則應(yīng)該使用列號(hào)。這些情況下,用戶將無(wú)法確切知道列名。
有些情況下,SQL 查詢返回的結(jié)果集中可能有多個(gè)列具有相同的名字。如果列名用作 getXXX 方法的參數(shù),則 getXXX 將返回第一個(gè)匹配列名的值。因而,如果多個(gè)列具有相同的名字,則需要使用列索引來(lái)確保檢索了正確的列值。這時(shí),使用列號(hào)效率要稍微高一些。
關(guān)于 ResultSet 中列的信息,可通過(guò)調(diào)用方法 ResultSet.getMetaData 得到。返回的 ResultSetMetaData 對(duì)象將給出其 ResultSet 對(duì)象各列的編號(hào)、類型和屬性。
如果列名已知,但不知其索引,則可用方法 findColumn 得到其列號(hào)。
5.1.3 數(shù)據(jù)類型和轉(zhuǎn)換
對(duì)于 getXXX 方法,JDBC 驅(qū)動(dòng)程序試圖將基本數(shù)據(jù)轉(zhuǎn)換成指定 Java 類型,然后返回適合的 Java 值。例如,如果 getXXX 方法為 getString,而基本數(shù)據(jù)庫(kù)中數(shù)據(jù)類型為 VARCHAR,則 JDBC 驅(qū)動(dòng)程序?qū)?VARCHAR 轉(zhuǎn)換成 Java String。getString 的返回值將為 Java String 對(duì)象。
下表顯示了允許用 getXXX 獲取的 JDBC 類型及推薦用它獲取的 JDBC 類型(通用 SQL 類型)。小寫的 x 表示允許 getXXX 方法獲取該數(shù)據(jù)類型;大寫的 X 表示對(duì)該數(shù)據(jù)類型推薦使用 getXXX 方法。例如,除了 getBytes 和 getBinaryStream 之外的任何 getXXX 方法都可用來(lái)獲取 LONGVARCHAR 值,但是推薦根據(jù)返回的數(shù)據(jù)類型使用 getAsciiStream 或 getUnicodeStream 方法。方法 getObject 將任何數(shù)據(jù)類型返回為 Java Object。當(dāng)基本數(shù)據(jù)類型是特定于數(shù)據(jù)庫(kù)的抽象類型或當(dāng)通用應(yīng)用程序需要接受任何數(shù)據(jù)類型時(shí),它是非常有用的。
可使用 ResultSet.getXXX 方法獲取常見的 JDBC 數(shù)據(jù)類型。
“x”表示該 getXXX 方法可合法地用于獲取給定 JDBC 類型。
“X”表示推薦使用該 getXXX 方法來(lái)獲取給定 JDBC 類型。
T
I
Y
I
T S
M
A
L
L
I
T I
T
E
G
E
R B
I
G
N
T R
E
A
L F
L
O
A
T D
O
U
L
E D
E
C
I
M
A
L N
U
M
E
R
I
C B
I
T C
H
A
R V
A
R
C
H
A
R
L
O
G
V
A
R
C
H
A
R B
I
A
R
Y V
A
R
I
A
R
Y L
O
G
V
A
R
I
A
R
Y D
A
T
E T
I
M
E T
I
M
E
T
A
M
getByte X x x x x x x x x x x x x
getShort x X x x x x x x x x x x x
getInt x x X x x x x x x x x x x
getLong x x x X x x x x x x x x x
getFloat x x x x X x x x x x x x x
getDouble x x x x x X X x x x x x x
getBigDecimal x x x x x x x X X x x x x
getBoolean x x x x x x x x x X x x x
getString x x x x x x x x x x X X x x x x x x x
getBytes X X x
getDate x x x X x
getTime x x x X x
getTimestamp x x x x X
getAsciiStream x x X x x x
getUnicodeStream x x X x x x
getBinaryStream x x X
getObject x x x x x x x x x x x x x x x x x x x
5.1.4 對(duì)非常大的行值使用流
ResultSet 可以獲取任意大的 LONGVARBINARY 或 LONGVARCHAR 數(shù)據(jù)。方法 getBytes 和 getString 將數(shù)據(jù)返回為大的塊(最大為 Statement.getMaxFieldSize 的返回值)。但是,以較小的固定塊獲取非常大的數(shù)據(jù)可能會(huì)更方便,而這可通過(guò)讓 ResultSet 類返回 java.io.Input 流來(lái)完成。從該流中可分塊讀取數(shù)據(jù)。注意:必須立即訪問(wèn)這些流,因?yàn)樵谙乱淮螌?duì) ResultSet 調(diào)用 getXXX 時(shí)它們將自動(dòng)關(guān)閉(這是由于基本實(shí)現(xiàn)對(duì)大塊數(shù)據(jù)訪問(wèn)有限制)。
JDBC API 具有三個(gè)獲取流的方法,分別具有不同的返回值:
getBinaryStream 返回只提供數(shù)據(jù)庫(kù)原字節(jié)而不進(jìn)行任何轉(zhuǎn)換的流。
getAsciiStream 返回提供單字節(jié) ASCII 字符的流。
getUnicodeStream 返回提供雙字節(jié) Unicode 字符的流。
注意:它不同于 Java 流,后者返回?zé)o類型字節(jié)并可(例如)通用于 ASCII 和 Unicode 字符。
下列代碼演示了 getAsciiStream 的用法:
java.sql.Statement stmt = con.createStatement();
ResultSet r = stmt.executeQuery("SELECT x FROM Table2");
// 現(xiàn)在以 4K 塊大小獲取列 1 結(jié)果:
byte buff = new byte[4096];
while (r.next()) {
Java.io.InputStream fin = r.getAsciiStream(1);
for (;;) {
int size = fin.read(buff);
if (size == -1) { // 到達(dá)流末尾
break;
}
// 將新填充的緩沖區(qū)發(fā)送到 ASCII 輸出流:
output.write(buff, 0, size);
}
}
5.1.5 NULL 結(jié)果值
要確定給定結(jié)果值是否是 JDBC NULL,必須先讀取該列,然后使用 ResultSet.wasNull 方法檢查該次讀取是否返回 JDBC NULL。
當(dāng)使用 ResultSet.getXXX 方法讀取 JDBC NULL 時(shí),方法 wasNull 將返回下列值之一:
Java null 值:對(duì)于返回 Java 對(duì)象的 getXXX 方法(例如 getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject 等)。
零值:對(duì)于 getByte、getShort、getInt、getLong、getFloat 和 getDouble。
false 值:對(duì)于 getBoolean。
5.1.6 可選結(jié)果集或多結(jié)果集
通常使用 executeQuery(它返回單個(gè) ResultSet)或 executeUpdate(它可用于任何數(shù)據(jù)庫(kù)修改語(yǔ)句,并返回更新行數(shù))可執(zhí)行 SQL 語(yǔ)句。但有些情況下,應(yīng)用程序在執(zhí)行語(yǔ)句之前不知道該語(yǔ)句是否返回結(jié)果集。此外,有些已存儲(chǔ)過(guò)程可能返回幾個(gè)不同的結(jié)果集和/或更新計(jì)數(shù)。
為了適應(yīng)這些情況,JDBC 提供了一種機(jī)制,允許應(yīng)用程序執(zhí)行語(yǔ)句,然后處理由結(jié)果集和更新計(jì)數(shù)組成的任意集合。這種機(jī)制的原理是首先調(diào)用一個(gè)完全通用的 execute 方法,然后調(diào)用另外三個(gè)方法,getResultSet、getUpdateCount 和 getMoreResults。這些方法允許應(yīng)用程序一次一個(gè)地研究語(yǔ)句結(jié)果,并確定給定結(jié)果是 ResultSet 還是更新計(jì)數(shù)。
用戶不必關(guān)閉 ResultSet;當(dāng)產(chǎn)生它的 Statement 關(guān)閉、重新執(zhí)行或用于從多結(jié)果序列中獲取下一個(gè)結(jié)果時(shí),該 ResultSet 將被 Statement 自動(dòng)關(guān)閉。
本概述是從《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》這本書中摘引來(lái)的。JavaSoft 目前正在準(zhǔn)備這本書。這是一本教程,同時(shí)也是 JDBC 的重要參考手冊(cè),它將作為 Java 系列的組成部份在 1997 年春季由 Addison-Wesley 出版公司出版。
5.1 概述
ResultSet 包含符合 SQL 語(yǔ)句中條件的所有行,并且它通過(guò)一套 get 方法(這些 get 方法可以訪問(wèn)當(dāng)前行中的不同列)提供了對(duì)這些行中數(shù)據(jù)的訪問(wèn)。ResultSet.next 方法用于移動(dòng)到 ResultSet 中的下一行,使下一行成為當(dāng)前行。
結(jié)果集一般是一個(gè)表,其中有查詢所返回的列標(biāo)題及相應(yīng)的值。例如,如果查詢?yōu)?SELECT a, b, c FROM Table1,則結(jié)果集將具有如下形式:
a b c
-------- --------- --------
12345 Cupertino CA
83472 Redmond WA
83492 Boston MA
下面的代碼段是執(zhí)行 SQL 語(yǔ)句的示例。該 SQL 語(yǔ)句將返回行集合,其中列 1 為 int,列 2 為 String,而列 3 則為字節(jié)數(shù)組:
java.sql.Statement stmt = conn.createStatement();
ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (r.next())
{
// 打印當(dāng)前行的值。
int i = r.getInt("a");
String s = r.getString("b");
float f = r.getFloat("c");
System.out.println("ROW = " + i + " " + s + " " + f);
}
5.1.1 行和光標(biāo)
ResultSet 維護(hù)指向其當(dāng)前數(shù)據(jù)行的光標(biāo)。每調(diào)用一次 next 方法,光標(biāo)向下移動(dòng)一行。最初它位于第一行之前,因此第一次調(diào)用 next 將把光標(biāo)置于第一行上,使它成為當(dāng)前行。隨著每次調(diào)用 next 導(dǎo)致光標(biāo)向下移動(dòng)一行,按照從上至下的次序獲取 ResultSet 行。
在 ResultSet 對(duì)象或其父輩 Statement 對(duì)象關(guān)閉之前,光標(biāo)一直保持有效。
在 SQL 中,結(jié)果表的光標(biāo)是有名字的。如果數(shù)據(jù)庫(kù)允許定位更新或定位刪除,則需要將光標(biāo)的名字作為參數(shù)提供給更新或刪除命令??赏ㄟ^(guò)調(diào)用方法 getCursorName 獲得光標(biāo)名。
注意:不是所有的 DBMS 都支持定位更新和刪除??墒褂?DatabaseMetaData.supportsPositionedDelete 和 supportsPositionedUpdate 方法來(lái)檢查特定連接是否支持這些操作。當(dāng)支持這些操作時(shí),DBMS/驅(qū)動(dòng)程序必須確保適當(dāng)鎖定選定行,以使定位更新不會(huì)導(dǎo)致更新異?;蚱渌l(fā)問(wèn)題。
5.1.2 列
方法 getXXX 提供了獲取當(dāng)前行中某列值的途徑。在每一行內(nèi),可按任何次序獲取列值。但為了保證可移植性,應(yīng)該從左至右獲取列值,并且一次性地讀取列值。
列名或列號(hào)可用于標(biāo)識(shí)要從中獲取數(shù)據(jù)的列。例如,如果 ResultSet 對(duì)象 rs 的第二列名為“title”,并將值存儲(chǔ)為字符串,則下列任一代碼將獲取存儲(chǔ)在該列中的值:
String s = rs.getString("title");
String s = rs.getString(2);
注意列是從左至右編號(hào)的,并且從列 1 開始。同時(shí),用作 getXXX 方法的輸入的列名不區(qū)分大小寫。
提供使用列名這個(gè)選項(xiàng)的目的是為了讓在查詢中指定列名的用戶可使用相同的名字作為 getXXX 方法的參數(shù)。另一方面,如果 select 語(yǔ)句未指定列名(例如在“select * from table1”中或列是導(dǎo)出的時(shí)),則應(yīng)該使用列號(hào)。這些情況下,用戶將無(wú)法確切知道列名。
有些情況下,SQL 查詢返回的結(jié)果集中可能有多個(gè)列具有相同的名字。如果列名用作 getXXX 方法的參數(shù),則 getXXX 將返回第一個(gè)匹配列名的值。因而,如果多個(gè)列具有相同的名字,則需要使用列索引來(lái)確保檢索了正確的列值。這時(shí),使用列號(hào)效率要稍微高一些。
關(guān)于 ResultSet 中列的信息,可通過(guò)調(diào)用方法 ResultSet.getMetaData 得到。返回的 ResultSetMetaData 對(duì)象將給出其 ResultSet 對(duì)象各列的編號(hào)、類型和屬性。
如果列名已知,但不知其索引,則可用方法 findColumn 得到其列號(hào)。
5.1.3 數(shù)據(jù)類型和轉(zhuǎn)換
對(duì)于 getXXX 方法,JDBC 驅(qū)動(dòng)程序試圖將基本數(shù)據(jù)轉(zhuǎn)換成指定 Java 類型,然后返回適合的 Java 值。例如,如果 getXXX 方法為 getString,而基本數(shù)據(jù)庫(kù)中數(shù)據(jù)類型為 VARCHAR,則 JDBC 驅(qū)動(dòng)程序?qū)?VARCHAR 轉(zhuǎn)換成 Java String。getString 的返回值將為 Java String 對(duì)象。
下表顯示了允許用 getXXX 獲取的 JDBC 類型及推薦用它獲取的 JDBC 類型(通用 SQL 類型)。小寫的 x 表示允許 getXXX 方法獲取該數(shù)據(jù)類型;大寫的 X 表示對(duì)該數(shù)據(jù)類型推薦使用 getXXX 方法。例如,除了 getBytes 和 getBinaryStream 之外的任何 getXXX 方法都可用來(lái)獲取 LONGVARCHAR 值,但是推薦根據(jù)返回的數(shù)據(jù)類型使用 getAsciiStream 或 getUnicodeStream 方法。方法 getObject 將任何數(shù)據(jù)類型返回為 Java Object。當(dāng)基本數(shù)據(jù)類型是特定于數(shù)據(jù)庫(kù)的抽象類型或當(dāng)通用應(yīng)用程序需要接受任何數(shù)據(jù)類型時(shí),它是非常有用的。
可使用 ResultSet.getXXX 方法獲取常見的 JDBC 數(shù)據(jù)類型。
“x”表示該 getXXX 方法可合法地用于獲取給定 JDBC 類型。
“X”表示推薦使用該 getXXX 方法來(lái)獲取給定 JDBC 類型。
T
I
Y
I
T S
M
A
L
L
I
T I
T
E
G
E
R B
I
G
N
T R
E
A
L F
L
O
A
T D
O
U
L
E D
E
C
I
M
A
L N
U
M
E
R
I
C B
I
T C
H
A
R V
A
R
C
H
A
R
L
O
G
V
A
R
C
H
A
R B
I
A
R
Y V
A
R
I
A
R
Y L
O
G
V
A
R
I
A
R
Y D
A
T
E T
I
M
E T
I
M
E
T
A
M
getByte X x x x x x x x x x x x x
getShort x X x x x x x x x x x x x
getInt x x X x x x x x x x x x x
getLong x x x X x x x x x x x x x
getFloat x x x x X x x x x x x x x
getDouble x x x x x X X x x x x x x
getBigDecimal x x x x x x x X X x x x x
getBoolean x x x x x x x x x X x x x
getString x x x x x x x x x x X X x x x x x x x
getBytes X X x
getDate x x x X x
getTime x x x X x
getTimestamp x x x x X
getAsciiStream x x X x x x
getUnicodeStream x x X x x x
getBinaryStream x x X
getObject x x x x x x x x x x x x x x x x x x x
5.1.4 對(duì)非常大的行值使用流
ResultSet 可以獲取任意大的 LONGVARBINARY 或 LONGVARCHAR 數(shù)據(jù)。方法 getBytes 和 getString 將數(shù)據(jù)返回為大的塊(最大為 Statement.getMaxFieldSize 的返回值)。但是,以較小的固定塊獲取非常大的數(shù)據(jù)可能會(huì)更方便,而這可通過(guò)讓 ResultSet 類返回 java.io.Input 流來(lái)完成。從該流中可分塊讀取數(shù)據(jù)。注意:必須立即訪問(wèn)這些流,因?yàn)樵谙乱淮螌?duì) ResultSet 調(diào)用 getXXX 時(shí)它們將自動(dòng)關(guān)閉(這是由于基本實(shí)現(xiàn)對(duì)大塊數(shù)據(jù)訪問(wèn)有限制)。
JDBC API 具有三個(gè)獲取流的方法,分別具有不同的返回值:
getBinaryStream 返回只提供數(shù)據(jù)庫(kù)原字節(jié)而不進(jìn)行任何轉(zhuǎn)換的流。
getAsciiStream 返回提供單字節(jié) ASCII 字符的流。
getUnicodeStream 返回提供雙字節(jié) Unicode 字符的流。
注意:它不同于 Java 流,后者返回?zé)o類型字節(jié)并可(例如)通用于 ASCII 和 Unicode 字符。
下列代碼演示了 getAsciiStream 的用法:
java.sql.Statement stmt = con.createStatement();
ResultSet r = stmt.executeQuery("SELECT x FROM Table2");
// 現(xiàn)在以 4K 塊大小獲取列 1 結(jié)果:
byte buff = new byte[4096];
while (r.next()) {
Java.io.InputStream fin = r.getAsciiStream(1);
for (;;) {
int size = fin.read(buff);
if (size == -1) { // 到達(dá)流末尾
break;
}
// 將新填充的緩沖區(qū)發(fā)送到 ASCII 輸出流:
output.write(buff, 0, size);
}
}
5.1.5 NULL 結(jié)果值
要確定給定結(jié)果值是否是 JDBC NULL,必須先讀取該列,然后使用 ResultSet.wasNull 方法檢查該次讀取是否返回 JDBC NULL。
當(dāng)使用 ResultSet.getXXX 方法讀取 JDBC NULL 時(shí),方法 wasNull 將返回下列值之一:
Java null 值:對(duì)于返回 Java 對(duì)象的 getXXX 方法(例如 getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject 等)。
零值:對(duì)于 getByte、getShort、getInt、getLong、getFloat 和 getDouble。
false 值:對(duì)于 getBoolean。
5.1.6 可選結(jié)果集或多結(jié)果集
通常使用 executeQuery(它返回單個(gè) ResultSet)或 executeUpdate(它可用于任何數(shù)據(jù)庫(kù)修改語(yǔ)句,并返回更新行數(shù))可執(zhí)行 SQL 語(yǔ)句。但有些情況下,應(yīng)用程序在執(zhí)行語(yǔ)句之前不知道該語(yǔ)句是否返回結(jié)果集。此外,有些已存儲(chǔ)過(guò)程可能返回幾個(gè)不同的結(jié)果集和/或更新計(jì)數(shù)。
為了適應(yīng)這些情況,JDBC 提供了一種機(jī)制,允許應(yīng)用程序執(zhí)行語(yǔ)句,然后處理由結(jié)果集和更新計(jì)數(shù)組成的任意集合。這種機(jī)制的原理是首先調(diào)用一個(gè)完全通用的 execute 方法,然后調(diào)用另外三個(gè)方法,getResultSet、getUpdateCount 和 getMoreResults。這些方法允許應(yīng)用程序一次一個(gè)地研究語(yǔ)句結(jié)果,并確定給定結(jié)果是 ResultSet 還是更新計(jì)數(shù)。
用戶不必關(guān)閉 ResultSet;當(dāng)產(chǎn)生它的 Statement 關(guān)閉、重新執(zhí)行或用于從多結(jié)果序列中獲取下一個(gè)結(jié)果時(shí),該 ResultSet 將被 Statement 自動(dòng)關(guān)閉。
相關(guān)文章
SSM框架整合JSP中集成easyui前端ui項(xiàng)目開發(fā)示例詳解
這篇文章主要介紹了SSM框架JSP中集成easyui前端ui項(xiàng)目開發(fā)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10基于javaweb+jsp實(shí)現(xiàn)企業(yè)車輛管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了javaweb+jsp實(shí)現(xiàn)企業(yè)車輛管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11JAVA/JSP學(xué)習(xí)系列之五(JDBC-ODBC翻頁(yè)例子)
JAVA/JSP學(xué)習(xí)系列之五(JDBC-ODBC翻頁(yè)例子)...2006-10-10