標籤:
DatabaseMetaData 有關整個資料庫的資訊:表名、表的索引、資料庫產品的名稱和版本、資料庫支援的操作。
ResultSet 關於某個表的資訊或一個查詢的結果。您必須逐行訪問資料行,但是您可以任何順序訪問列。
ResultSetMetaData 有關 ResultSet 中列的名稱和類型的資訊。
儘管每個對象都有大量的方法讓您獲得資料庫元素的極為詳細的資訊,但在每個對象中都有幾種主要的方法使您可獲得資料的最重要訊息。然而,如果您希望看到比此處更多的資訊,建議您學習文檔以獲得其餘方法的說明。
ResultSet
ResultSet 對象是 JDBC 中最重要的單個對象。從本質上講,它是對一個一般寬度和未知長度的表的一種抽象。幾乎所有的方法和查詢都將資料作為 ResultSet 返回。ResultSet 包含任意數量的命名列,您可以按名稱訪問這些列。它還包含一個或多個行,您可以按順序自上而下逐一訪問。在您使用 ResultSet 之前,必須查詢它包含多少個列。此資訊儲存在 ResultSetMetaData 對象中。
//從中繼資料中獲得列數
ResultSetMetaData rsmd;
rsmd = results.getMetaData();
numCols = rsmd.getColumnCount();
當您獲得一個 ResultSet 時,它正好指向第一行之前的位置。您可以使用 next() 方法得到其他每一行,當沒有更多行時,該方法會返回 false。由於從資料庫中擷取資料可能會導致錯誤,您必須始終將結果集處理語句包括在一個 try 塊中。
您可以多種形式擷取 ResultSet 中的資料,這取決於每個列中儲存的資料類型。另外,您可以按列序號或列名擷取列的內容。請注意,列序號從 1 開始,而不是從 0 開始。ResultSet 對象的一些最常用方法如下所示。
getInt(int); 將序號為 int 的列的內容作為整數返回。
getInt(String); 將名稱為 String 的列的內容作為整數返回。
getFloat(int); 將序號為 int 的列的內容作為一個 float 型數返回。
getFloat(String); 將名稱為 String 的列的內容作為 float 型數返回。
getDate(int); 將序號為 int 的列的內容作為日期返回。
getDate(String); 將名稱為 String 的列的內容作為日期返回。
next(); 將行指標移到下一行。如果沒有剩餘行,則返回 false。
Close(); 關閉結果集。
getMetaData(); 返回 ResultSetMetaData 對象。
ResultSetMetaData
您使用 getMetaData() 方法從 ResultSet 中擷取 ResultSetMetaData 對象。您可以使用此對象獲得列的數目和類型以及每一列的名稱。
getColumnCount(); 返回 ResultSet 中的列數。
getColumnName(int); 返回列序號為 int 的列名。
getColumnLabel(int); 返回此列暗含的標籤。
isCurrency(int); 如果此列包含帶有貨幣單位的一個數字,則返回 true。
isReadOnly(int); 如果此列為唯讀,則返回 true。
isAutoIncrement(int); 如果此列自動遞增,則返回 true。這類列通常為鍵,而且始終是唯讀。
getColumnType(int); 返回此列的 SQL 資料類型。這些資料類型包括
BIGINT
BINARY
BIT
CHAR
DATE
DECIMAL
DOUBLE
FLOAT
INTEGER
LONGVARBINARY
LONGVARCHAR
NULL
NUMERIC
OTHER
REAL
SMALLINT
TIME
TIMESTAMP
TINYINT
VARBINARY
VARCHAR
DatabaseMetaData
DatabaseMetaData 對象可為您提供整個資料庫的資訊。您主要用它擷取資料庫中表的名稱,以及表中列的名稱。由於不同的資料庫支援不同的 SQL 變體,因此,也有多種方法查詢資料庫支援哪些 SQL 方法。
getCatalogs() 返回該資料庫中的資訊目錄列表。使用 JDBC-ODBC Bridge 驅動程式,您可以獲得用 ODBC 註冊的資料庫列表。這很少用於 JDBC-ODBC 資料庫。
getTables(catalog, schema,tableNames, columnNames) 返回表名與 tableNames 相符而且列名與 columnNames 相符的所有表的說明。
getColumns(catalog, schema,tableNames, columnNames) 返回表名與 tableNames 相符而且列名與 columnNames 相符的所有表列說明。
getURL(); 獲得您所串連的 URL 名稱。
getDriverName(); 獲得您所串連的資料庫驅動程式的名稱。
擷取有關表的資訊
您可以使用 DataBaseMetaData 的 getTables() 方法來擷取資料庫中表的資訊。這個方法有如下4個 String 參數:
results =dma.getTables(catalog, schema, tablemask, types[]);
其中參數的意義是:
Catalog 要在其中尋找表名的目錄名。對於 JDBC-ODBC 資料庫以及許多其他資料庫而言,可將其設定為 null。這些資料庫的目錄項實際上是它在檔案系統中的絕對路徑名稱。
Schema 要包括的資料庫“方案”。許多資料庫不支援方案,而對另一些資料庫而言,它代表資料庫擁有者的使用者名稱。一般將它設定為 null。
Tablemask 一個掩碼,用來描述您要檢索的表的名稱。如果您希望檢索所有表名,則將其設為萬用字元 %。請注意,SQL 中的萬用字元是 % 符號,而不是一般 PC 使用者的 * 符號。
types[] 這是描述您要檢索的表的類型的 String 數組。資料庫中通常包括許多用於內部處理的表,而對作為使用者的您沒什麼價值。如果它是空值,則您會得到所有這些表。如果您將其設為包含字串“TABLES”的單元素數組,您將僅獲得對使用者有用的表格。
一個簡單的 JDBC 程式
我們已經學習了 JDBC 的所有準系統,現在我們可以編寫一個簡單的程式,該程式開啟資料庫,列印它的表名以及某一表列的內容,然後對該資料庫執行查詢。此程式如下所示:
package skydevkit;
import java.sql.*;
public class JdbcOdbc_test {
ResultSet results;
ResultSetMetaData rsmd;
DatabaseMetaData dma;
Connection con;
public JdbcOdbc_test() throws SQLException {
String url = "jdbc:odbc:Northwind";
try {
//載入 JDBC-ODBC 橋驅動程式
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection(url);//串連資料庫
dma = con.getMetaData();//擷取資料庫的中繼資料
System.out.println("Connected to:" + dma.getURL());
System.out.println("Driver " + dma.getDriverName());
} catch (Exception e) {
System.out.println(e);
}
try {
Statement stmt = con.createStatement();
results = stmt.executeQuery("select * from 客戶;");
ResultSetMetaData resultMetaData = results.getMetaData();
int cols = resultMetaData.getColumnCount();
String resultRow = "";
for (int i = 1; i < cols; i++) {
resultRow += resultMetaData.getColumnName(i) + ";";
}
System.out.println(resultRow);
while (results.next()) {
resultRow = "";
for (int i = 1; i < cols; i++) {
try {
resultRow += results.getString(i) + ";";
} catch (NullPointerException e) {
System.out.println(e.getMessage());
}
}
System.out.println(resultRow);
}
} catch (Exception e) {
System.out.println("query exception");
} finally {
results.close();
}
}
}
補充進階內容
關於調用SQLServer預存程序的例子:(用到了我們開發的資料庫連接類)
CREATE PROCEDURE [dbo].[sp_getStudentByName](@name char(10))
AS
Select * from Students where [Name][email protected]
GO
DbObject DbO = new DbObject(new SqlServerConnectionFactory("localhost",
1433, "demo", "sa", ""));
Connection con = DbO.getConnection();
CallableStatement pstmt = null;
System.out.println("TestDB1()............");
/* try {
pstmt = con.prepareCall("{call sp_getStudentById(?)}");
pstmt.setInt(1, 1);
}*/
try {
pstmt = con.prepareCall("{call sp_getStudentByName(?)}"); //注意參數如何傳遞
pstmt.setString(1, "Tom");
}
使用輸出參數:
CREATE PROCEDURE [dbo].[sp_insertStudent](@name char(10),@age int,@id int OUTPUT) AS
insert into Students([Name],[Age]) values (@name,@age)
select @[email protected]@IDENTITY
GO
try {
pstmt = con.prepareCall("{call sp_insertStudent(?,?,?)}");
pstmt.setString(1, "zengqingsong");
pstmt.setInt(2, 22);
pstmt.registerOutParameter(3, Types.INTEGER);
pstmt.executeUpdate();
int id = pstmt.getInt(3);
System.out.println(id);
}
使用返回參數的例子:
CREATE PROCEDURE [dbo].[sp_insertStudent](@name char(10),@age int,@id int OUTPUT) AS
insert into Students([Name],[Age]) values (@name,@age)
select @[email protected]@IDENTITY –測試輸出參數
return 30 –測試返回30
GO
try {
pstmt = con.prepareCall("{?=call sp_insertStudent(?,?,?)}");
pstmt.setString(2, "zengqingsong");
pstmt.setInt(3, 22);
pstmt.registerOutParameter(4, Types.INTEGER);
pstmt.registerOutParameter(1, Types.INTEGER);
int ret = pstmt.executeUpdate(); //執行影響的行數
int ret2 = pstmt.getInt(1); //返回參數(輸出參數)
int id = pstmt.getInt(4); //輸出參數
System.out.println(ret);
System.out.println(ret2);
System.out.println(id);
ResultSet相關ResultSetMetaData詳細