管理當前線路
我們編寫了第一個程序並且運行良好。我們編寫了一個查詢,執行了它,結果executeQuery()方法返回了一個對像給我們結果集包含所有查詢結果的 。現在我們將嘗試弄清楚如何從中獲得這些結果。
查詢結果可能包含各種類型的數千行和數百列,因此這並不像您想像的那麼簡單。例如,圖片可以存儲在數據庫中,然後您可以將圖片作為一組字節或InputStream來下載。
但我們將從最簡單的開始——“當前結果行”的概念。由於結果通常有很多行,因此對象結果集裡面有一個指向當前行的指針。並順序切換行以使用next()方法讀取它們。
這種方法主要是為了優化。在您按順序讀取字符串之前,JDBC 驅動程序可能不會從數據庫中加載字符串。您也從頭到尾按順序閱讀FileInputStream 。因此,您應該熟悉並理解這種方法。
但是,如果您確實需要它,則可以使用RandomAccessFile類在任何地方讀取文件。
ResultSet類也允許類似的東西,並允許您將當前行沿著結果移動到任何地方。為此,它有以下方法:
方法 | 描述 | |
---|---|---|
1個 | 下一個() | 切換到下一行 |
2個 | 以前的() | 切換到上一行 |
3個 | isFirst() | 當前行優先? |
4個 | isBeforeFirst() | 我們在第一線前面嗎? |
5個 | 最後一個() | 當前行是最後一行嗎? |
6個 | isAfterLast() | 我們在截止日期之後嗎? |
7 | 絕對(int n) | 使第 N 行成為當前行 |
8個 | 相對(int n) | 將當前行向前移動 N 個位置。N 可以小於 0 |
9 | 獲取行() | 返回行號 |
方法很簡單,但是需要說明兩點。結果就像兩邊的空線框起來一樣。因此,最初當前行在結果的第一行之前。要獲得第一行,您需要至少調用一次next()方法。
如果您在最後一行調用了next()方法,那麼您將移動到最後一行之後的那一行。您無法從中讀取數據,但不會發生錯誤。這裡的isAfterLast()方法將聲明 true 作為結果。
例子:
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
System.out.println( results.getRow() ); // 0
System.out.println( results.isBeforeFirst() ); // true
System.out.println( results.isFirst() ); // false
results.next();
System.out.println( results.getRow() ); // 1
System.out.println( results.isBeforeFirst() ); // false
System.out.println( results.isFirst() ); // true
results.next();
System.out.println( results.getRow() ); // 2
System.out.println( results.isBeforeFirst() ); // false
System.out.println( results.isFirst() ); // false
從當前行獲取數據
您已經學會了熟練地管理當前行。現在讓我們弄清楚如何從中獲取數據。為此,對象結果集有一些特殊的方法可以用一個模板來描述:
getType(numberColumns)
但是,如果列有名稱,那麼您也可以通過列名獲取:
getType(nameColumns)
例子:
while (results.next()) {
Integer id = results.getInt(“id”);
String name = results.getString(“name”);
System.out.println(results.getRow() + ". " + id + "\t"+ name);
}
下面我將提供一個表格,幫助您關聯 SQL 數據類型和 ResultSet 方法:
SQL數據類型 | getXXX() 方法 |
---|---|
字符 | 獲取字符串() |
變量 | 獲取字符串() |
情報局 | 獲取整數() |
漂浮 | getDouble() |
CLOB | 得到Clob() |
BLOB | 獲取Blob() |
日期 | 獲取日期() |
時間 | 獲取時間() |
時間戳 | 獲取時間戳() |
重點,我想你明白了。
獲取有關 ResultSet 的不同數據
我們想出瞭如何從當前行讀取數據:通過列號和名稱。順便說一句,我怎樣才能通過編號找到列名?或者結果中的列數?
一方面,如果你寫了一個請求,那麼你似乎必須知道這一切。另一方面,我們可以編寫一個在屏幕上顯示查詢結果的程序:查詢被傳遞給我們,我們只想在屏幕上(在控制台、網頁中)顯示 SQL 服務器返回的所有內容給我們。
JDBC 為此有一個特殊的對象,即ResultSetMetaData接口。獲取這種類型的對象非常簡單:
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
ResultSetMetaData resultSetMetaData = results.getMetaData();
ResultSetMetaData接口有一些非常有趣的方法。以下是最受歡迎的:
1個 | getColumnCount() | 返回結果列數 |
2個 | getColumnName(整數列) | 返回列名 |
3個 | getColumnLabel(整數列) | 返回列的描述 |
4個 | getColumnType() | 返回列類型:數字(特殊代碼) |
5個 | getColumnTypeName() | 返回列類型:字符串 |
6個 | getColumnClassName() | 返回列類型的 java 類名 |
7 | 獲取表名() | 返回表名 |
8個 | 獲取目錄名稱() | 返回列的目錄名稱 |
9 | 獲取架構名稱() | 返回數據庫的模式名稱 |
10 | isAutoIncrement(整數列) | 該列是否支持 AUTO INCREMENT? |
十一 | 可空() | 列可以包含 NULL 嗎? |
讓我們用它來了解一下我們的表:
ResultSetMetaData metaData = results.getMetaData();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++)
{
String name = metaData.getColumnName(column);
String className = metaData.getColumnClassName(column);
String typeName = metaData.getColumnTypeName(column);
int type = metaData.getColumnType(column);
System.out.println(name + "\t" + className + "\t" + typeName + "\t" + type);
}
重要的!請注意,列是從 1 開始編號的。順便說一句,行也是如此。這有多不尋常,對吧?
這是我運行程序後得到的結果:
“C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe... | |||
ID | java.lang.整數 | 情報局 | 4個 |
姓名 | java.lang.字符串 | 變量 | 12 |
等級 | java.lang.整數 | 情報局 | 4個 |
創建日期 | java.sql.日期 | 日期 | 91 |
進程結束,退出代碼為 0 |
GO TO FULL VERSION