ResultSetMetaData 、DatabaseMetaData中的方法的介紹
如何獲取數據庫信息及表的信息,如:數據庫中有多少表,表中的字段的含義等,這裏用主要用到相關的兩個類ResultSetMetaData和DataBaseMetaData:
首先是ResultSetMetaData:
使用DatabaseMetaData則是用來獲得數據庫的信息,下面介紹這個類的使用方法。
DatabaseMetaData對象提供的是關於數據庫的各種信息,這些信息包括:
1、 數據庫與用戶,數據庫標識符以及函數與存儲過程。
2、 數據庫限制。
3、 數據庫支持不支持的功能。
4、 架構、編目、表、列和視圖等。
通過調用DatabaseMetaData的各種方法,程序可以動態的瞭解一個數據庫。由於這個類中的方法非常的多那麼就介紹幾個常用的方法來給大家參考。
DatabaseMetaData實例的獲取方法是,通過連接來獲得的
Connection conn = //創建的連接。
DatabaseMetaData dbmd = Conn.getMetaData();
創建了這個實例,就可以使用他的方法來獲取數據庫得信息。首先是數據庫中用戶標識符的信息的獲得,主要使用如下的方法:
getDatabaseProductName()用以獲得當前數據庫是什麼數據庫。比如oracle,access等。返回的是字符串。
getDatabaseProductVersion()獲得數據庫的版本。返回的字符串。
getDriverVersion()獲得驅動程序的版本。返回字符串。
supportsResultSetType(ResultSet.resultype)是判定是否支持這種結果集的類型。比如參數如果是Result.TYPE_FORWARD_ONLY,那就是判定是否支持,只能先前移動結果集的指針。返回值爲boolean,true表示支持。
上面介紹的只是幾個常用的方法,這個類中還有很多方法,可以到jdk的幫助文檔中去查看類java.sql.DatabaseMetaData。
這個類中還有一個比較常用的方法就是獲得表的信息。使用的方法是:
getTables(String catalog,String schema,String tableName,String[] types),
這個方法帶有四個參數,他們表示的含義如下:
String catalog——要獲得表所在的編目。串“”””意味着沒有任何編目,Null表示所有編目。
String schema——要獲得表所在的模式。串“”””意味着沒有任何模式,Null表示所有模式。該參數可以包含單字符的通配符(“_”),也可以包含多字符的通配符(“%”)。
String tableName——指出要返回表名與該參數匹配的那些表,該參數可以包含單字符的通配符(“_”),也可以包含多字符的通配符(“%”)。
String types——一個指出返回何種表的數組。可能的數組項是:”TABLE”,”VIEW”,
”SYSTEM TABLE”,”GLOBAL TEMPORARY”,”LOCAL TEMPORARY”,”ALIAS”,
“SYSNONYM”。
通過getTables()方法返回一個表的信息的結果集。
這個結果集包括字段有:TABLE_CAT表所在的編目。TABLE_SCHEM表所在的模式,TABLE_NAME表的名稱。TABLE_TYPE標的類型。REMARKS一段解釋性的備註。通過這些字段可以完成表的信息的獲取。
還有兩個方法一個是獲得列:
getColumns(String catalog,String schama,String tablename,String columnPattern)一個是獲得關鍵字的方法
getPrimaryKeys(String catalog, String schema, String table)這兩個方法中的參數的含義和上面的介紹的是相同的。
凡是pattern的都是可以用通配符匹配的。getColums()返回的是結果集,這個結果集包括了列的所有信息,類型,名稱,可否爲空等。getPrimaryKey()則是返回了某個表的關鍵字的結果集。
通過getTables(),getColumns(),getPrimaryKeys()就可以完成表的反向設計了。主要步驟如下:
1、 通過getTables()獲得數據庫中表的信息。
2、 對於每個表使用,getColumns(),getPrimaryKeys()獲得相應的列名,類型,限制條件,關鍵字等。
3、 通過1,2獲得信息可以生成相應的建表的SQL語句。
public void getResultSetMetaData() {
String sqlStr = "SELECT * FROM STUDENTINFO";
ResultSet rs = null;
Statement smt = null;
try {
String[] tp = {"TABLE"};
smt = conn.createStatement();
rs = smt.executeQuery(sqlStr);
ResultSetMetaData rsmd = rs.getMetaData();
/*
獲得ResultSetMeataData對象。所有方法的參數都是列的索引號,即第幾列,從1開始
*/
System.out.println("下面這些方法是ResultSetMetaData中方法");
System.out.println("獲得1列所在的Catalog名字 : " + rsmd.getCatalogName(1));
System.out.println("獲得1列對應數據類型的類 " + rsmd.getColumnClassName(1));
System.out.println("獲得該ResultSet所有列的數目 " + rsmd.getColumnCount());
System.out.println("1列在數據庫中類型的最大字符個數" + rsmd.getColumnDisplaySize(1));
System.out.println("1列的默認的列的標題" + rsmd.getColumnLabel(1));
System.out.println("1列的模式" + rsmd.getSchemaName(1));
System.out.println("1列的類型,返回SqlType中的編號 " + rsmd.getColumnType(1));
System.out.println("1列在數據庫中的類型,返回類型全名" + rsmd.getColumnTypeName(1));
System.out.println("1列類型的精確度(類型的長度): " + rsmd.getPrecision(1));
System.out.println("1列小數點後的位數 " + rsmd.getScale(1));
System.out.println("1列對應的模式的名稱(應該用於Oracle) " + rsmd.getSchemaName(1));
System.out.println("1列對應的表名 " + rsmd.getTableName(1));
System.out.println("1列是否自動遞增" + rsmd.isAutoIncrement(1));
System.out.println("1列在數據庫中是否爲貨幣型" + rsmd.isCurrency(1));
System.out.println("1列是否爲空" + rsmd.isNullable(1));
System.out.println("1列是否爲只讀" + rsmd.isReadOnly(1));
System.out.println("1列能否出現在where中" + rsmd.isSearchable(1));
}
catch (SQLException ex) {
ex.printStackTrace();
}
}
String sqlStr = "SELECT * FROM STUDENTINFO";
ResultSet rs = null;
Statement smt = null;
try {
String[] tp = {"TABLE"};
smt = conn.createStatement();
rs = smt.executeQuery(sqlStr);
ResultSetMetaData rsmd = rs.getMetaData();
/*
獲得ResultSetMeataData對象。所有方法的參數都是列的索引號,即第幾列,從1開始
*/
System.out.println("下面這些方法是ResultSetMetaData中方法");
System.out.println("獲得1列所在的Catalog名字 : " + rsmd.getCatalogName(1));
System.out.println("獲得1列對應數據類型的類 " + rsmd.getColumnClassName(1));
System.out.println("獲得該ResultSet所有列的數目 " + rsmd.getColumnCount());
System.out.println("1列在數據庫中類型的最大字符個數" + rsmd.getColumnDisplaySize(1));
System.out.println("1列的默認的列的標題" + rsmd.getColumnLabel(1));
System.out.println("1列的模式" + rsmd.getSchemaName(1));
System.out.println("1列的類型,返回SqlType中的編號 " + rsmd.getColumnType(1));
System.out.println("1列在數據庫中的類型,返回類型全名" + rsmd.getColumnTypeName(1));
System.out.println("1列類型的精確度(類型的長度): " + rsmd.getPrecision(1));
System.out.println("1列小數點後的位數 " + rsmd.getScale(1));
System.out.println("1列對應的模式的名稱(應該用於Oracle) " + rsmd.getSchemaName(1));
System.out.println("1列對應的表名 " + rsmd.getTableName(1));
System.out.println("1列是否自動遞增" + rsmd.isAutoIncrement(1));
System.out.println("1列在數據庫中是否爲貨幣型" + rsmd.isCurrency(1));
System.out.println("1列是否爲空" + rsmd.isNullable(1));
System.out.println("1列是否爲只讀" + rsmd.isReadOnly(1));
System.out.println("1列能否出現在where中" + rsmd.isSearchable(1));
}
catch (SQLException ex) {
ex.printStackTrace();
}
}