***************************************
首先呢,當(dāng)然是元數(shù)據(jù)
***************************************
元數(shù)據(jù)(Meta Data)是關(guān)于數(shù)據(jù)倉庫的數(shù)據(jù),指在數(shù)據(jù)倉庫建設(shè)過程中所產(chǎn)生的有關(guān)數(shù)據(jù)源定義,目標(biāo)定義,轉(zhuǎn)換規(guī)則等相關(guān)的關(guān)鍵數(shù)據(jù)。同時元數(shù)據(jù)還包含關(guān)于數(shù)據(jù)含義的商業(yè)信息,所有這些信息都應(yīng)當(dāng)妥善保存,并很好地管理。為數(shù)據(jù)倉庫的發(fā)展和使用提供方便。
元數(shù)據(jù)是一種二進(jìn)制信息,用以對存儲在公共語言運行庫可移植可執(zhí)行文件 (PE) 文件或存儲在內(nèi)存中的程序進(jìn)行描述。將您的代碼編譯為 PE 文件時,便會將元數(shù)據(jù)插入到該文件的一部分中,而將代碼轉(zhuǎn)換為 Microsoft 中間語言 (MSIL) 并將其插入到該文件的另一部分中。在模塊或程序集中定義和引用的每個類型和成員都將在元數(shù)據(jù)中進(jìn)行說明。當(dāng)執(zhí)行代碼時,運行庫將元數(shù)據(jù)加載到內(nèi)存中,并引用它來發(fā)現(xiàn)有關(guān)代碼的類、成員、繼承等信息。
元數(shù)據(jù)以非特定語言的方式描述在代碼中定義的每一類型和成員。元數(shù)據(jù)存儲以下信息:
程序集的說明。
標(biāo)識(名稱、版本、區(qū)域性、公鑰)。
導(dǎo)出的類型。
該程序集所依賴的其他程序集。
運行所需的安全權(quán)限。
類型的說明。
名稱、可見性、基類和實現(xiàn)的接口。
成員(方法、字段、屬性、事件、嵌套的類型)。
屬性。
修飾類型和成員的其他說明性元素。
一、元數(shù)據(jù)的優(yōu)點
對于一種更簡單的編程模型來說,元數(shù)據(jù)是關(guān)鍵,該模型不再需要接口定義語言 (IDL) 文件、頭文件或任何外部組件引用方法。元數(shù)據(jù)允許 .NET 語言自動以非特定語言的方式對其自身進(jìn)行描述,而這是開發(fā)人員和用戶都無法看見的。另外,通過使用屬性,可以對元數(shù)據(jù)進(jìn)行擴(kuò)展。元數(shù)據(jù)具有以下主要優(yōu)點:
自描述文件。
公共語言運行庫模塊和程序集是自描述的。模塊的元數(shù)據(jù)包含與另一個模塊進(jìn)行交互所需的全部信息。元數(shù)據(jù)自動提供 COM 中 IDL 的功能,允許將一個文件同時用于定義和實現(xiàn)。運行庫模塊和程序集甚至不需要向操作系統(tǒng)注冊。結(jié)果,運行庫使用的說明始終反映編譯文件中的實際代碼,從而提高應(yīng)用程序的可靠性。
語言互用性和更簡單的基于組件的設(shè)計。
元數(shù)據(jù)提供所有必需的有關(guān)已編譯代碼的信息,以供您從用不同語言編寫的 PE 文件中繼承類。您可以創(chuàng)建用任何托管語言(任何面向公共語言運行庫的語言)編寫的任何類的實例,而不用擔(dān)心顯式封送處理或使用自定義的互用代碼。
二、屬性。
.NET Framework 允許您在編譯文件中聲明特定種類的元數(shù)據(jù)(稱為屬性)。在整個 .NET Framework 中到處都可以發(fā)現(xiàn)屬性的存在,屬性用于更精確地控制運行時您的程序如何工作。另外,您可以通過用戶定義的自定義屬性向 .NET Framework 文件發(fā)出您自己的自定義元數(shù)據(jù)。有關(guān)更多信息,請參見利用屬性擴(kuò)展元數(shù)據(jù)。
三、元數(shù)據(jù)的意義
說到元數(shù)據(jù)的意義,可以從其應(yīng)用目的來談的。雖然做數(shù)據(jù)倉庫言必稱元數(shù)據(jù),必稱技術(shù)、業(yè)務(wù)元數(shù)據(jù),但其到底用于何處?離開了目標(biāo)去談元數(shù)據(jù),就發(fā)現(xiàn)元數(shù)據(jù)包含太多的東西,因為他是描述數(shù)據(jù)的數(shù)據(jù)嘛。
還是那客戶關(guān)系系統(tǒng)來比喻,這個系統(tǒng)維護(hù)客戶信息當(dāng)然是有目的的,是要用這些信息進(jìn)行一些自動的流程處理、去挖掘一些客戶潛在的價值、做好客戶服務(wù)。當(dāng)然 沒有必要去維護(hù)客戶的生命特征信息,諸如指紋、犯罪史等,這些信息跟客戶關(guān)系管理的目標(biāo)關(guān)系不大。元數(shù)據(jù)也是如此,你可以將所以數(shù)據(jù)的結(jié)構(gòu)、大小、什么時 間創(chuàng)建、什么時間消亡、被那些人使用等等,這些信息可以延伸得太廣,如果不管目標(biāo),而試圖去建一個非常完美的元數(shù)據(jù)管理體系,這是一種絕對的"自上而下" 做法,必敗無疑。
四、元數(shù)據(jù)列舉
基于應(yīng)用,可以將元數(shù)據(jù)分成以下的若干中。
數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)集的名稱、關(guān)系、字段、約束等;
數(shù)據(jù)部署:數(shù)據(jù)集的物理位置;
數(shù)據(jù)流:數(shù)據(jù)集之間的流程依賴關(guān)系(非參照依賴),包括數(shù)據(jù)集到另一個數(shù)據(jù)集的規(guī)則;
質(zhì)量度量:數(shù)據(jù)集上可以計算的度量;
度量邏輯關(guān)系:數(shù)據(jù)集度量之間的邏輯運算關(guān)系;
ETL過程:過程運行的順序,并行、串行;
數(shù)據(jù)集快照:一個時間點上,數(shù)據(jù)在所有數(shù)據(jù)集上的分布情況;
星型模式元數(shù)據(jù):事實表、維度、屬性、層次等;
報表語義層:報表指標(biāo)的規(guī)則、過濾條件物理名稱和業(yè)務(wù)名稱的對應(yīng);
數(shù)據(jù)訪問日志:哪些數(shù)據(jù)何時被何人訪問;
質(zhì)量稽核日志:何時、何度量被稽核,其結(jié)果;
數(shù)據(jù)裝載日志:哪些數(shù)據(jù)何時被何人裝載;
五、元數(shù)據(jù)開發(fā)應(yīng)用的標(biāo)準(zhǔn)化框架
1、數(shù)字圖書館資源組織框架
2. 元數(shù)據(jù)開發(fā)應(yīng)用框架
2.1 元數(shù)據(jù)的基本意義 Metadata(元數(shù)據(jù))是“關(guān)于數(shù)據(jù)的數(shù)據(jù)”;
元數(shù)據(jù)為各種形態(tài)的數(shù)字化信息單元和資源集合提供規(guī)范、普遍的描述方法和檢索工具;
元數(shù)據(jù)為分布的、由多種數(shù)字化資源有機構(gòu)成的信息體系(如數(shù)字圖書館)提供整合的工具與紐帶。
離開元數(shù)據(jù)的數(shù)字圖書館將是一盤散沙,將無法提供有效的檢索和處理。
3. 元數(shù)據(jù)應(yīng)用環(huán)境
3.1 Metadata的應(yīng)用目的
(1)確認(rèn)和檢索(Discovery andentification),主要致力于如何幫助人們檢索和確認(rèn)所需要的資源,數(shù)據(jù)元素往往限于作者、標(biāo)題、主題、位置等簡單信息,Dublin Core是其典型代表。
(2)著錄描述(Cataloging),用于對數(shù)據(jù)單元進(jìn)行詳細(xì)、全面的著錄描述,數(shù)據(jù)元素囊括內(nèi)容、載體、位置與獲取方式、制作與利用方法、甚至相關(guān) 數(shù)據(jù)單元方面等,數(shù)據(jù)元素數(shù)量往往較多,MARC、GILS和FGDC/CSDGM是這類Metadata的典型代表。
(3)資源管理(Resource Administration),支持資源的存儲和使用管理,數(shù)據(jù)元素除比較全面的著錄描述信息外,還往往包括權(quán)利管理(Rights/Privacy Management)、電子簽名(Digital Signature)、資源評鑒(Seal of Approval/Rating)、使用管理(Access Management)、支付審計(Payment and Accounting)等方面的信息。
(4)資源保護(hù)與長期保存(Preservation and Archiving),支持對資源進(jìn)行長期保存,數(shù)據(jù)元素除對資源進(jìn)行描述和確認(rèn)外,往往包括詳細(xì)的格式信息、制作信息、保護(hù)條件、轉(zhuǎn)換方式 (Migration Methods)、保存責(zé)任等內(nèi)容。
3.2 Metadata在不同領(lǐng)域的應(yīng)用 根據(jù)不同領(lǐng)域的數(shù)據(jù)特點和應(yīng)用需要,90年代以來,許多Metadata格式在各個不同領(lǐng)域出現(xiàn)
例如:
網(wǎng)絡(luò)資源:Dublin Core、IAFA Template、CDF、Web Collections
文獻(xiàn)資料:MARC(with 856 Field),Dublic Core
人文科學(xué):TEI Header
社會科學(xué)數(shù)據(jù)集:ICPSR SGML Codebook
博物館與藝術(shù)作品:CIMI、CDWA、RLG REACH Element Set、VRA Core
政府信息:GILS
地理空間信息:FGDC/CSDGM
數(shù)字圖像:MOA2 metadata、CDL metadata、Open Archives Format、VRA Core、NISO/CLIR/RLG Technical Metadata for Images
檔案庫與資源集合:EAD
技術(shù)報告:RFC 1807
連續(xù)圖像:MPEG-7
3.3 Metadata格式的應(yīng)用程度
不同領(lǐng)域的Metadata處于不同的標(biāo)準(zhǔn)化階段:
在網(wǎng)絡(luò)資源描述方面,Dublin Core經(jīng)過多年國際性努力,已經(jīng)成為一個廣為接受和應(yīng)用的事實標(biāo)準(zhǔn);
在政府信息方面,由于美國政府大力推動和有關(guān)法律、標(biāo)準(zhǔn)的實行,GILS已經(jīng)成為政府信息描述標(biāo)準(zhǔn),并在世界若干國家得到相當(dāng)程度的應(yīng)用,與此類似的還有地理空間信息處理的FGDC/CSDGM;
但在某些領(lǐng)域,由于技術(shù)的迅速發(fā)展變化,仍然存在多個方案競爭,典型的是數(shù)字圖像的Metadata,現(xiàn)在提出的許多標(biāo)準(zhǔn)都處于實驗和完善的階段。
3.4 Metadata格式“標(biāo)準(zhǔn)化”程度問題
Metadata開發(fā)應(yīng)用經(jīng)驗表明,很難有一個統(tǒng)一的Metadata格式來滿足所有領(lǐng)域的數(shù)據(jù)描述需要;即使在同一個領(lǐng)域,也可能為了不同目的而需要不同的但可相互轉(zhuǎn)換的Metadata格式。
同時,統(tǒng)一的集中計劃式的Metadata格式標(biāo)準(zhǔn)也不適合Internet環(huán)境,不利于充分利用市場機制和各方面力量。
但在同一領(lǐng)域,應(yīng)爭取“標(biāo)準(zhǔn)化”,在不同領(lǐng)域,應(yīng)妥善解決不同格式的互操作問題。
4. 元數(shù)據(jù)結(jié)構(gòu)
4.1 總體結(jié)構(gòu)定義方式 一個Metadata格式由多層次的結(jié)構(gòu)予以定義:
(1)內(nèi)容結(jié)構(gòu)(Content Structure),對該Metadata的構(gòu)成元素及其定義標(biāo)準(zhǔn)進(jìn)行描述。
(2)句法結(jié)構(gòu)(Syntax Structure),定義Metadata結(jié)構(gòu)以及如何描述這種結(jié)構(gòu)。
(3)語義結(jié)構(gòu)(Semantic Structure),定義Metadata元素的具體描述方法。
4.2 內(nèi)容結(jié)構(gòu)
內(nèi)容結(jié)構(gòu)定義Metadata的構(gòu)成元素,可包括: 描述性元素、技術(shù)性元素、管理性元素、結(jié)構(gòu)性元素(例如與編碼語言、Namespace、數(shù)據(jù)單元等的鏈接)。
這些數(shù)據(jù)元素很可能依據(jù)一定標(biāo)準(zhǔn)來選取,因此元數(shù)據(jù)內(nèi)容結(jié)構(gòu)中需要對此進(jìn)行說明,例如MARC記錄所依據(jù)的ISBD,EAD所參照的ISAD(G),ICPSR所依據(jù)的ICPSR Data Preparation Manual。
4.3 句法結(jié)構(gòu)
句法結(jié)構(gòu)定義格式結(jié)構(gòu)及其描述方式,例如元素的分區(qū)分段組織、元素選取使用規(guī)則、元素描述方法(例如Dublin Core采用ISO/IEC 11179標(biāo)準(zhǔn))、元素結(jié)構(gòu)描述方法(例如MARC記錄結(jié)構(gòu)、SGML結(jié)構(gòu)、XML結(jié)構(gòu))、結(jié)構(gòu)語句描述語言(例如EBNF Notation)等。
有時,句法結(jié)構(gòu)需要指出元數(shù)據(jù)是否與所描述的數(shù)據(jù)對象捆綁在一起、或作為單獨數(shù)據(jù)存在但以一定形式與數(shù)據(jù)對象鏈接,還可能描述與定義標(biāo)準(zhǔn)、DTD結(jié)構(gòu)和Namespace等的鏈接方式。
4.4 語義結(jié)構(gòu) 語義結(jié)構(gòu)定義元素的具體描述方法,例如 描述元素時所采用的標(biāo)準(zhǔn)、最佳實踐(Best Practices)或自定義的描述要求(Instructions)。
有些元數(shù)據(jù)格式本身定義了語義結(jié)構(gòu),而另外一些則由具體采用單位規(guī)定語義結(jié)構(gòu),例如Dublin Core建議日期元素采用ISO 8601、資源類型采用Dublin Core Types、數(shù)據(jù)格式可采用MIME、識別號采用URL或DOI或ISBN;
又如OhioLink在使用VRA Core時要求主題元素使用A&AT、TGM和TGN,人名元素用ULAN。
5. 元數(shù)據(jù)編碼語言與制作方式
5.1 元數(shù)據(jù)編碼語言
元數(shù)據(jù)編碼語言(Metadata Encoding Languages)指對元數(shù)據(jù)元素和結(jié)構(gòu)進(jìn)行定義和描述的具體語法和語義規(guī)則,常稱為定義描述語言(DDL)。
在元數(shù)據(jù)發(fā)展初期人們常使用自定義的記錄語言(例如MARC)或數(shù)據(jù)庫記錄結(jié)構(gòu)(如ROADS等),但隨著元數(shù)據(jù)格式的增多和互操作的要求,人們開始采用一些標(biāo)準(zhǔn)化的DDL來描述元數(shù)據(jù),例如SGML和XML,其中以XML最有潛力。
5.2 元數(shù)據(jù)制作方式
(1)專門編制模塊(例如對MARC、GILS、FGDC等)
(2)數(shù)據(jù)處理時自動編制(例如對Dublin Core等)
(3)數(shù)據(jù)物理處理時自動編制(例如數(shù)字圖像掃描時的某些元數(shù)據(jù)參數(shù))
(4)共享元數(shù)據(jù)(例如OCLC/CORC、IMESH
6. 元數(shù)據(jù)互操作性
6.1 元數(shù)據(jù)互操作性問題
由于不同的領(lǐng)域(甚至同一領(lǐng)域)往往存在多個元數(shù)據(jù)格式,當(dāng)在用不同元數(shù)據(jù)格式描述的資源體系之間進(jìn)行檢索、資源描述和資源利用時,就存在元數(shù)據(jù)的互操作性問題(Interoperability):
多個不同元數(shù)據(jù)格式的釋讀、轉(zhuǎn)換和由多個元數(shù)據(jù)格式描述的數(shù)字化信息資源體系之間的透明檢索。
6.2 元數(shù)據(jù)格式映射
利用特定轉(zhuǎn)換程序?qū)Σ煌獢?shù)據(jù)元格式進(jìn)行轉(zhuǎn)換,稱為元數(shù)據(jù)映射(Metadata Mapping/Crosswalking)。
目前已有大量的轉(zhuǎn)換程序存在,供若干流行元數(shù)據(jù)格式之間的轉(zhuǎn)化,例如
Dublin Core與USMARC; Dublin Core與EAD
Dublin Core與GILS; GILS與MARC TEI
Header與MARC FGDC與MARC
也可利用一種中介格式對同一格式框架下的多種元數(shù)據(jù)格式進(jìn)行轉(zhuǎn)換,例如UNIverse項目利用GRS格式進(jìn)行各種MARC格式和其它記錄格式的轉(zhuǎn)換。格
式映射轉(zhuǎn)換準(zhǔn)確、轉(zhuǎn)換效率較高。不過,這種方法在面對多種元數(shù)據(jù)格式并存的開放式環(huán)境中的應(yīng)用效率明顯受到限制。
6.3 標(biāo)準(zhǔn)描述框架
解決元數(shù)據(jù)互操作性的另一種思路是建立一個標(biāo)準(zhǔn)的資源描述框架,用這個框架來描述所有元數(shù)據(jù)格式,那么只要一個系統(tǒng)能夠解析這個標(biāo)準(zhǔn)描述框架,就能解讀相應(yīng)的Metadata格式. 實際上,XML和RDF從不同角度起著類似的作用。
XML通過其標(biāo)準(zhǔn)的DTD定義方式,允許所有能夠解讀XML語句的系統(tǒng)辨識用XML_DTD定義的Metadata格式,從而解決對不同格式的釋讀問題。
RDF定義了由Resources、Properties和Statements等三種對象組成的基本模型,其中Resources和Properties關(guān)系類似于E-R模型,而Statements則對該關(guān)系進(jìn)行具體描述。
RDF通過這個抽象的數(shù)據(jù)模型為定義和使用元數(shù)據(jù)建立一個框架,元數(shù)據(jù)元素可看成其描述的資源的屬性。
進(jìn)一步地,RDF定義了標(biāo)準(zhǔn)Schema,規(guī)定了聲明資源類型、聲明相關(guān)屬性及其語義的機制,以及定義屬性與其它資源間關(guān)系的方法。另外,RDF還規(guī)定了利用XML Namespace方法調(diào)用已有定義規(guī)范的機制,
6.4 數(shù)字對象方式
建立包含元數(shù)據(jù)及其轉(zhuǎn)換機制的數(shù)字對象可能從另一個角度解決元數(shù)據(jù)互操作性問題。
Cornell/FEDORA項目提出由內(nèi)核(Structural Kernel)和功能傳播層(Disseminator Layer)組成的復(fù)合數(shù)字對象。
內(nèi)核里,可以容納以比特流形式存在的文獻(xiàn)內(nèi)容、描述該文獻(xiàn)的元數(shù)據(jù)、以及對這個文獻(xiàn)及元數(shù)據(jù)進(jìn)行存取控制的有關(guān)數(shù)據(jù)。
功能傳播層,主功能傳播器(PrimitiveDisseminator)支持有關(guān)解構(gòu)內(nèi)核數(shù)據(jù)類型和對內(nèi)核數(shù)據(jù)讀取的服務(wù)功能,還可有內(nèi)容類型傳播器(Content-Type Disseminators),它們可內(nèi)嵌元數(shù)據(jù)格式轉(zhuǎn)換機制。
例如,在一個數(shù)字對象的內(nèi)核中存有MARC格式的元數(shù)據(jù),在功能傳播層裝載有請求Dublin Core格式及其轉(zhuǎn)換服務(wù)的內(nèi)容類型傳播器。當(dāng)數(shù)字對象使用者要求讀取以Dublin Core表示的元數(shù)據(jù)時,相應(yīng)的內(nèi)容類型傳播器將通過網(wǎng)絡(luò)請求存儲有Dublin Core及其轉(zhuǎn)換服務(wù)程序的數(shù)字對象,然后將被請求數(shù)字對象中的MARC形式元數(shù)據(jù)轉(zhuǎn)換為Dublin Core形式,在輸出給用戶。
7. 幾點建議
跟蹤元數(shù)據(jù)發(fā)展、積極參與制定元數(shù)據(jù)標(biāo)準(zhǔn)、加快元數(shù)據(jù)應(yīng)用、注意國際接軌。
加快研究有效利用元數(shù)據(jù)進(jìn)行檢索(包括異構(gòu)系統(tǒng)透明檢索)、相關(guān)性學(xué)習(xí)、個性化處理等的機制。
加快研究元數(shù)據(jù)與數(shù)字對象和數(shù)字化資源體系有機整合的途徑與方法。
推進(jìn)研究利用元數(shù)據(jù)進(jìn)行基于知識的數(shù)據(jù)組織和知識發(fā)現(xiàn)。
**************************************
元數(shù)據(jù)接口使用詳解
*******************************
- ResultSetMetaData對象
當(dāng)在JDBC應(yīng)用程序中發(fā)送select語句時,該操作會返回一個ResultSet對象,這個ResultSet對象包含滿足條件的數(shù)據(jù)。通過創(chuàng)建 ResultMetaData對象和調(diào)用該對象的方法,可以獲取與這個ResultSet對象中的列有關(guān)的信息。下面的代碼段將創(chuàng)建ResultSet對 象rs,然后使用rs來創(chuàng)建ResultSetMetaData對象,所創(chuàng)建的ResultSetMetaData對象包含與rs中的列有關(guān)的信息。Statement stmt= con . createStatement();
現(xiàn)在可以使用rsmd調(diào)用ResultSetMetaData的方法來訪問與rs中的列有關(guān)的信息。除了方法 getColumnCount給出結(jié)果集中總的列數(shù)外,所有的ResultSetMetaData方法都返回與單個列有關(guān)的信息,并都接受一個表示對應(yīng)列 號的參數(shù)。
ResultSet rs = stmt.executeQuery(“select * from sales”);
ResultSetMetaData rsmd = rs.getMetaData();- getColumnCount方法
這也許是ResultSetMetaData中使用最多的方法,該方法返回結(jié)果集中列數(shù)目 :1 ResultSet rs = stmt.executeQuery(“select * from sales”);
2 ResultSetMetaData rsmd = rs.getMetaData();
3 int numberOfColumns = rsmd.getColumnCount();
4 while(rs.next()){
5 for(int i=1;i<=numberOfColumn;i++){
6 String s = rs.getString(i);
7 System.out.println(“Column ” +i +”: ” +s +” ”);
8 }
9 } - 獲取列類型信息
有兩個ResultSetMetaData方法可以獲取與結(jié)果集列的類型有關(guān)的信息。這兩個方法是getColumnType和 getColumnTypeName。getColumnType方法用于確定存儲在指定列中的值的JDBC類型。該方法以一個int值來返回JDBC類 型。如下面的代碼獲得rs第二列的JDBC類型:ResultSetMetaData rsmd = rs.getMetaData();
int jdbcType = rsmd.getColumnType(2); - 獲取其他信息
另外有幾個方法用來提供與存儲數(shù)值類型的列有關(guān)的信息。isAutoIncrement
isCurrency
isSigned
getPrecision
getScale
isNullable
getColumnDisplaySize
- getColumnCount方法
- 使用DatabaseMetaData對象
接口DatabaseMetaData提供了大量的方法取得與數(shù)據(jù)庫相關(guān)的信息。一旦獲得了打開的連接,就可以創(chuàng)建包含與數(shù)據(jù)庫系統(tǒng)有關(guān)的信息的DatabaseMetaData對象。 - DatabaseMetaData方法的類別
按照返回值的類型對DatabaseMetaData的方法進(jìn)行分類,可以分為4種。
有三種類型返回單一的值,另外一種返回一個結(jié)果集,這個結(jié)果集包含1~18列的數(shù)據(jù)。
① 返回String的方法 - 獲取與主外鍵有關(guān)的信息
返回與主外鍵有關(guān)信息的方法主要有g(shù)etPrimaryKeys、getImportedKeys、getExportedKeys以及getCrossReference等。
下面的代碼段顯示了如果在定義表時指定了主鍵,則可以調(diào)用方法getPrimaryKeys開獲取對于表中主鍵列的描述。1 import java.sql.*;
2 public class static PrimaryKeysExample{
3 public static void main(String args[]){
4 String url =”jdbc:mySubprotocol:myDataSource”;
5 Connection con;
6 String createString =”create table supplierspk”+
7 “(sup_id integer not null,”+
8 “sup_name varchar(40),”+
9 “street varchar(40),”+
10 “city varchar(20)”+
11 “state char(10),”+
12 “zip char(10),”+
13 “primary key(sup_id))”;
14 Statement stmt;
15 try{
16 Class.forName(“myDriver.className”);
17 }catch(java.lang.ClassNotFoundException e){
18 System.err.println(“ClassNotFoundException: ”);
19 System.err.println(“e.getMessage()”);
20 }
21 try{
22 con =DriverManager.getConnection(url,”username”,”pwd”);
23 stmt=con.createStatement;
24 stmt.executeUpdate(createString);
25 DatabaseMetaData dbmd=con.getMetaData();
26 ResultSet rs= dbmd.getPrimaryKey(null,null,”suplierspk”);
27 While(rs.next()){
28 String name =rs.getString(“table_name”);
29 String columnName=rs.getString(“column_name”);
30 String keySeq=rs.getString(“key_seq”);
31 String pkName=rs.getString(“pk_name”);
32 System.out.println(“table name :”+name);
33 System.out.println(“column name: ”+columnName);
34 System.out.println(“sequence in key:”+keySeq);
35 System.out.println(“primary key name:”+pkName);
36 }
37 rs.close();
38 stmt.close();
39 con.close();
40 }catch(SQLException ex){
41 System.err.println(“SQLException: ”+ex.getMessage());
42 }
43 }
44 } - 使用ParameterMetaData對象
可以使用ParameterMetaData對象來獲取與PreparedStatement對象或者CallableStatement對象 有關(guān)的信息。這些參數(shù)由”?”占位符表示,”?”占位符是提供給Connection方法prepareStatement和prepareCall的 SQL語句。下面的代碼行使用兩個參數(shù)占位符來創(chuàng)建一個PreparedStatement對象。
PreparedStatement pstmt=con.prepareStatement(“select id from employees where dept=? and salary>?”);
這些參數(shù)根據(jù)其序號來編號,因此第一個參數(shù)編號1,第二個參數(shù)編號2,依此類推。在上面的代碼行中,參數(shù)1是列dept中的一個值,參數(shù)2是 salary中的一個值。下面的代碼段用于找出PreparedStatement pstmt有多少個參數(shù)。首先創(chuàng)建pstmt并用它來創(chuàng)建ParameterMetaData對象pmd,這個對象包含與pstmt中的參數(shù)有關(guān)的信息。 接著調(diào)用pmd上的方法getColumnCount來找出pstmt有多少參數(shù)。1 PreparedStatement pstmt=con.prepareStatement(
2 “update employees set salary =? Where level=?”);
3 ParameterMetaData pmd = pstmt.getParameterMetaData();
4 int count=pmd.getParameterCount();
最小的類別是指返回String對象的DatabaseMetaData方法。這些方法中的一些方法可以獲取與DBMS有關(guān)的總體信息,包括數(shù)據(jù)庫的URL、username、產(chǎn)品名稱、驅(qū)動程序信息等等。
② 返回int的方法
③ 返回boolean的方法
④返回ResultSet對象的方法
這些方法可以返回ResultSet對象,所返回的ResultSet對象可以包含1到最多18列。
補充說明數(shù)據(jù)庫訪問
******************************
一旦連接到數(shù)據(jù)庫,就可以請求表名以及表列的名稱和內(nèi)容等信息,而且您可以運行 SQL 語句來查詢數(shù)據(jù)庫或者添加或修改其內(nèi)容。可用來從數(shù)據(jù)庫中獲取信息的對象有:
DatabaseMetaData | 有關(guān)整個數(shù)據(jù)庫的信息:表名、表的索引、數(shù)據(jù)庫產(chǎn)品的名稱和版本、數(shù)據(jù)庫支持的操作。 |
ResultSet | 關(guān)于某個表的信息或一個查詢的結(jié)果。您必須逐行訪問數(shù)據(jù)行,但是您可以任何順序訪問列。 |
ResultSetMetaData | 有關(guān)ResultSet中列的名稱和類型的信息。 |
盡管每個對象都有大量的方法讓您獲得數(shù)據(jù)庫元素的極為詳細(xì)的信息,但在每個對象中都有幾種主要的方法使您可獲得數(shù)據(jù)的最重要信息。然而,如果您希望看到比此處更多的信息,建議您學(xué)習(xí)文檔以獲得其余方法的說明。
· ResultSet
ResultSet 對象是 JDBC 中最重要的單個對象。從本質(zhì)上講,它是對一個一般寬度和未知長度的表的一種抽象。幾乎所有的方法和查詢都將數(shù)據(jù)作為 ResultSet 返回。 ResultSet 包含任意數(shù)量的命名列,您可以按名稱訪問這些列。它還包含一個或多個行,您可以按順序自上而下逐一訪問。在您使用 ResultSet 之前,必須查詢它包含多少個列。此信息存儲在 ResultSetMetaData 對象中。// 從元數(shù)據(jù)中獲得列數(shù) ResultSetMetaData rsmd; rsmd = results.getMetaData(); numCols = rsmd.getColumnCount(); |
當(dāng)您獲得一個ResultSet時,它正好指向第一行之前的位置。您可以使用 next() 方法得到其他每一行,當(dāng)沒有更多行時,該方法會返回 false 。由于從數(shù)據(jù)庫中獲取數(shù)據(jù)可能會導(dǎo)致錯誤,您必須始終將結(jié)果集處理語句包括在一個 try 塊中。
try { rsmd = results.getMetaData(); numCols = rsmd.getColumnCount(); boolean more = results.next(); while (more) { for (i = 1; i <= numCols; i++) System.out.print(results.getString(i)+” ”); System.out.println(); more = results.next(); } results.close(); } catch(Exception e) {System.out.println(e.getMessage());} |
您可以多種形式獲取 ResultSet 中的數(shù)據(jù),這取決于每個列中存儲的數(shù)據(jù)類型。另外,您可以按列序號或列名獲取列的內(nèi)容。請注意,列序號從 1 開始,而不是從 0 開始。 ResultSet 對象的一些最常用方法如下所示。
getInt(int); | 將序號為 int 的列的內(nèi)容作為整數(shù)返回。 |
getInt(String); | 將名稱為 String 的列的內(nèi)容作為整數(shù)返回。 |
getFloat(int); | 將序號為 int 的列的內(nèi)容作為一個 float 型數(shù)返回。 |
g<tt>etFloat(String);</tt> | 將名稱為 String 的列的內(nèi)容作為 float 型數(shù)返回。 |
getDate(int); | 將序號為 int 的列的內(nèi)容作為日期返回。 |
getDate(String); | 將名稱為 String 的列的內(nèi)容作為日期返回。 |
next(); | 將行指針移到下一行。如果沒有剩余行,則返回 false 。 |
close(); | 關(guān)閉結(jié)果集。 |
getMetaData(); | 返回 ResultSetMetaData 對象。 |
· ResultSetMetaData
您使用 getMetaData() 方法從 ResultSet 中獲取 ResultSetMetaData 對象。您可以使用此對象獲得列的數(shù)目和類型以及每一列的名稱。
|
返回 ResultSet 中的列數(shù)。 | ||
getColumnName(int); | 返回列序號為 int 的列名。 | ||
getColumnLabel(int); | 返回此列暗含的標(biāo)簽。 | ||
isCurrency(int); | 如果此列包含帶有貨幣單位的一個數(shù)字,則返回 true 。 | ||
isReadOnly(int); | 如果此列為只讀,則返回 true 。 | ||
isAutoIncrement(int); | 如果此列自動遞增,則返回 true 。這類列通常為鍵,而且始終是只讀的。 | ||
getColumnType(int); | 返回此列的SQL數(shù)據(jù)類型。這些數(shù)據(jù)類型包括
|
· DatabaseMetaData
DatabaseMetaData對象可為您提供整個數(shù)據(jù)庫的信息。您主要用它獲取數(shù)據(jù)庫中表的名稱,以及表中列的名稱。由于不同的數(shù)據(jù)庫支持不同的 SQL 變體,因此,也有多種方法查詢數(shù)據(jù)庫支持哪些 SQL 方法。getCatalogs() | 返回該數(shù)據(jù)庫中的信息目錄列表。使用 JDBC-ODBC Bridge 驅(qū)動程序,您可以獲得用 ODBC 注冊的數(shù)據(jù)庫列表。這很少用于 JDBC-ODBC 數(shù)據(jù)庫。 |
getTables(catalog, schema, tableNames, columnNames) | 返回表名與 tableNames 相符而且列名與 columnNames 相符的所有表的說明。 |
getColumns(catalog, schema, tableNames,columnNames) | 返回表名與 tableNames 相符而且列名與 columnNames 相符的所有表列說明。 |
getURL(); | 獲得您所連接的URL名稱。 |
getDriverName(); | 獲得您所連接的數(shù)據(jù)庫驅(qū)動程序的名稱。 |
· 獲取有關(guān)表的信息
您可以使用 DataBaseMetaData 的 getTables() 方法來獲取數(shù)據(jù)庫中表的信息。這個方法有如下 4 個 String 參數(shù):
results = dma.getTables(catalog, schema, tablemask, types[]); |
其中參數(shù)的意義是:
catalog | 要在其中查找表名的目錄名。對于 JDBC-ODBC 數(shù)據(jù)庫以及許多其他數(shù)據(jù)庫而言,可將其設(shè)置為 null。這些數(shù)據(jù)庫的目錄項實際上是它在文件系統(tǒng)中的絕對路徑名稱。 |
schema | 要包括的數(shù)據(jù)庫“方案”。許多數(shù)據(jù)庫不支持方案,而對另一些數(shù)據(jù)庫而言,它代表數(shù)據(jù)庫所有者的用戶名。一般將它設(shè)置為 null 。 |
tablemask | 一個掩碼,用來描述您要檢索的表的名稱。如果您希望檢索所有表名,則將其設(shè)為通配符 % 。 請注意, SQL 中的通配符是 % 符號,而不是一般PC用戶的*符號。 |
types[] | 這是描述您要檢索的表的類型的String數(shù)組。數(shù)據(jù)庫中通常包括許多用于內(nèi)部處理的表,而對作為用戶的您沒什么價值。如果它是空值,則您會得到所有這些表。如果您將其設(shè)為包含字符串“ TABLES ”的單元素數(shù)組,您將僅獲得對用戶有用的表格。 |
用于從數(shù)據(jù)庫中獲取表名的簡單代碼相當(dāng)于獲取 DatabaseMetaData 對象,并從其中檢索表名:
con = DriverManager.getConnection(url); //獲取數(shù)據(jù)庫的元數(shù)據(jù) dma =con.getMetaData(); String[] types = new String[1]; //請注意通配符是 results = dma.getTables(null, null, ”%”, types); |
然后,我們可以打印出表名,正如我們上面所做的那樣:
boolean more = results.next(); while (more) { for (i = 1; i <= numCols; i++) System.out.print(results.getString(i)+” ”); System.out.println(); more = results.next(); } |