管理當前線路

我們編寫了第一個程序並且運行良好。我們編寫了一個查詢,執行了它,結果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