有時,我們對一種新的數據庫根本不知道它的結構或者是其中的內容,好壞麼我們如何來獲取數據庫的情況呢?
真實的例子是這樣的,我的朋友的公司接到了一個單子,對方使用的數據庫是叫什麼"titanium"的,說實話由於本人的孤陋寡聞,在此之前從來不知道還有這種數據庫,更別說如何訪問了,現在朋友要看裡面有什麼"東西",當然是一籌莫展.所以只好找我.
接到電話後,我先問他是什麼平台上跑的,如果連結的,他說是在Windows下可以建立ODBC數據源,哈哈,就是說可以用Java建立Connection了,OK只能建立一下Connection,那麼就可以得到這個數據庫的所有元信息:
DatabaseMetadata dbmd = conn.getMetadata();然後你可以從這個對象獲取以下信息:
getUrl(); //返回與這個數據庫的連結的URL,當然是已知的,要不你怎麼連上去
getUserName(); //返回與這個數據庫的連結的用戶,同上
isReadOnly();數據庫是否為只讀
getDatabaseProduceName();//數據庫產品名稱
getDatabaseProduceVersion();//版本號
getDriverName();//驅動程序
getDriverVersion();//驅動程序版本
以上內容沒有什麼意義
ResultSet getTables(String catalog,
String schemaPattern,
String tableNamePattern,
String[] types)
可以得到該庫中"表"的所有情況,這裡的表包括表,視圖,系統表,臨時空間,別名,同義詞對於各參數:
String catalog,表的目錄,可能為null,"null"匹配所有
String schemaPattern,表的大綱,同上
String tableNamePattern,表名,同上
String[] types,表的類型,"null"匹配所有,可用的類型為:
TABLE,VIEW,SYSEM TABLE,GLOBAL TEMPORARY,LOCAL TEMPORARY,ALIAS,SYNONYM
例如:
DatabaseMetaData dbmd = conn.getMetaData();
ResultSet rs = dbmd.getTables(null,null,null,null);
ResultSetMetaData rsmd = rs.getMetaData();
int j = rsmd.getColumnCount();
for(int i=1;i<=j;i++){
out.print(rsmd.getColumnLabel(i)+"");
}
out.println();
while(rs.next()){
for(int i=1;i<=j;i++){
out.print(rs.getString(i)+"");
}
out.println();
}
對於更詳細的表中的列的信息,可以用dbmd(不是rsmd).getColumns(
String catalog,
String schemaPattern,
String tableNamePattern,
String columnNamePattern
)
不僅可以獲得rsmd中的信息,還可以獲得列的大小,小數位數,精度,缺省值,列在表中的位置等相關信息.
還有兩個方法,調用和獲取表信息一樣,可以獲得存儲過程和索引的信息:
ResultSet getProcedures(
String catalog,
String schemaPattern,
String procedurePattern
);
ResultSet getIndexINFO(
String catalog,
String schemaPattern,
String table,
boolean unique,boolean approximate
);