posts - 97,  comments - 93,  trackbacks - 0
          元數(shù)據(jù)是利用JDBC創(chuàng)建和操作數(shù)據(jù)庫(kù)對(duì)象的一個(gè)很重要的概念和應(yīng)用,所以今天我特地的找了一些詳細(xì)解析個(gè)概念的資料,和利用java來(lái)操作的實(shí)例。
          ***************************************
          首先呢,當(dāng)然是元數(shù)據(jù)
          ***************************************
            元數(shù)據(jù)Meta Data)是關(guān)于數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù),指在數(shù)據(jù)倉(cāng)庫(kù)建設(shè)過(guò)程中所產(chǎn)生的有關(guān)數(shù)據(jù)源定義,目標(biāo)定義,轉(zhuǎn)換規(guī)則等相關(guān)的關(guān)鍵數(shù)據(jù)。同時(shí)元數(shù)據(jù)還包含關(guān)于數(shù)據(jù)含義的商業(yè)信息,所有這些信息都應(yīng)當(dāng)妥善保存,并很好地管理。為數(shù)據(jù)倉(cāng)庫(kù)的發(fā)展和使用提供方便。

                元數(shù)據(jù)是一種二進(jìn)制信息,用以對(duì)存儲(chǔ)在公共語(yǔ)言運(yùn)行庫(kù)可移植可執(zhí)行文件 (PE) 文件或存儲(chǔ)在內(nèi)存中的程序進(jìn)行描述。將您的代碼編譯為 PE 文件時(shí),便會(huì)將元數(shù)據(jù)插入到該文件的一部分中,而將代碼轉(zhuǎn)換為 Microsoft 中間語(yǔ)言 (MSIL) 并將其插入到該文件的另一部分中。在模塊或程序集中定義和引用的每個(gè)類(lèi)型和成員都將在元數(shù)據(jù)中進(jìn)行說(shuō)明。當(dāng)執(zhí)行代碼時(shí),運(yùn)行庫(kù)將元數(shù)據(jù)加載到內(nèi)存中,并引用它來(lái)發(fā)現(xiàn)有關(guān)代碼的類(lèi)、成員、繼承等信息。

               元數(shù)據(jù)以非特定語(yǔ)言的方式描述在代碼中定義的每一類(lèi)型和成員。元數(shù)據(jù)存儲(chǔ)以下信息:

                程序集的說(shuō)明。
                標(biāo)識(shí)(名稱(chēng)、版本、區(qū)域性、公鑰)。
                導(dǎo)出的類(lèi)型。
                該程序集所依賴(lài)的其他程序集。
                運(yùn)行所需的安全權(quán)限。
                類(lèi)型的說(shuō)明。
                名稱(chēng)、可見(jiàn)性、基類(lèi)和實(shí)現(xiàn)的接口。
                成員(方法、字段、屬性、事件、嵌套的類(lèi)型)。
                屬性。
                修飾類(lèi)型和成員的其他說(shuō)明性元素。

          一、元數(shù)據(jù)的優(yōu)點(diǎn)

                對(duì)于一種更簡(jiǎn)單的編程模型來(lái)說(shuō),元數(shù)據(jù)是關(guān)鍵,該模型不再需要接口定義語(yǔ)言 (IDL) 文件、頭文件或任何外部組件引用方法。元數(shù)據(jù)允許 .NET 語(yǔ)言自動(dòng)以非特定語(yǔ)言的方式對(duì)其自身進(jìn)行描述,而這是開(kāi)發(fā)人員和用戶(hù)都無(wú)法看見(jiàn)的。另外,通過(guò)使用屬性,可以對(duì)元數(shù)據(jù)進(jìn)行擴(kuò)展。元數(shù)據(jù)具有以下主要優(yōu)點(diǎn):

                自描述文件。
                公共語(yǔ)言運(yùn)行庫(kù)模塊和程序集是自描述的。模塊的元數(shù)據(jù)包含與另一個(gè)模塊進(jìn)行交互所需的全部信息。元數(shù)據(jù)自動(dòng)提供 COM 中 IDL 的功能,允許將一個(gè)文件同時(shí)用于定義和實(shí)現(xiàn)。運(yùn)行庫(kù)模塊和程序集甚至不需要向操作系統(tǒng)注冊(cè)。結(jié)果,運(yùn)行庫(kù)使用的說(shuō)明始終反映編譯文件中的實(shí)際代碼,從而提高應(yīng)用程序的可靠性。

                語(yǔ)言互用性和更簡(jiǎn)單的基于組件的設(shè)計(jì)。
                元數(shù)據(jù)提供所有必需的有關(guān)已編譯代碼的信息,以供您從用不同語(yǔ)言編寫(xiě)的 PE 文件中繼承類(lèi)。您可以創(chuàng)建用任何托管語(yǔ)言(任何面向公共語(yǔ)言運(yùn)行庫(kù)的語(yǔ)言)編寫(xiě)的任何類(lèi)的實(shí)例,而不用擔(dān)心顯式封送處理或使用自定義的互用代碼。

          二、屬性。

                .NET Framework 允許您在編譯文件中聲明特定種類(lèi)的元數(shù)據(jù)(稱(chēng)為屬性)。在整個(gè) .NET Framework 中到處都可以發(fā)現(xiàn)屬性的存在,屬性用于更精確地控制運(yùn)行時(shí)您的程序如何工作。另外,您可以通過(guò)用戶(hù)定義的自定義屬性向 .NET Framework 文件發(fā)出您自己的自定義元數(shù)據(jù)。有關(guān)更多信息,請(qǐng)參見(jiàn)利用屬性擴(kuò)展元數(shù)據(jù)。

          三、元數(shù)據(jù)的意義

                說(shuō)到元數(shù)據(jù)的意義,可以從其應(yīng)用目的來(lái)談的。雖然做數(shù)據(jù)倉(cāng)庫(kù)言必稱(chēng)元數(shù)據(jù),必稱(chēng)技術(shù)、業(yè)務(wù)元數(shù)據(jù),但其到底用于何處?離開(kāi)了目標(biāo)去談元數(shù)據(jù),就發(fā)現(xiàn)元數(shù)據(jù)包含太多的東西,因?yàn)樗敲枋鰯?shù)據(jù)的數(shù)據(jù)嘛。

                還是那客戶(hù)關(guān)系系統(tǒng)來(lái)比喻,這個(gè)系統(tǒng)維護(hù)客戶(hù)信息當(dāng)然是有目的的,是要用這些信息進(jìn)行一些自動(dòng)的流程處理、去挖掘一些客戶(hù)潛在的價(jià)值、做好客戶(hù)服務(wù)。當(dāng)然 沒(méi)有必要去維護(hù)客戶(hù)的生命特征信息,諸如指紋、犯罪史等,這些信息跟客戶(hù)關(guān)系管理的目標(biāo)關(guān)系不大。元數(shù)據(jù)也是如此,你可以將所以數(shù)據(jù)的結(jié)構(gòu)、大小、什么時(shí) 間創(chuàng)建、什么時(shí)間消亡、被那些人使用等等,這些信息可以延伸得太廣,如果不管目標(biāo),而試圖去建一個(gè)非常完美的元數(shù)據(jù)管理體系,這是一種絕對(duì)的"自上而下" 做法,必?cái)o(wú)疑。

          四、元數(shù)據(jù)列舉

                基于應(yīng)用,可以將元數(shù)據(jù)分成以下的若干中。

                數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)集的名稱(chēng)、關(guān)系、字段、約束等;
                數(shù)據(jù)部署:數(shù)據(jù)集的物理位置;
                數(shù)據(jù)流:數(shù)據(jù)集之間的流程依賴(lài)關(guān)系(非參照依賴(lài)),包括數(shù)據(jù)集到另一個(gè)數(shù)據(jù)集的規(guī)則;
                質(zhì)量度量:數(shù)據(jù)集上可以計(jì)算的度量;
                度量邏輯關(guān)系:數(shù)據(jù)集度量之間的邏輯運(yùn)算關(guān)系;
                ETL過(guò)程:過(guò)程運(yùn)行的順序,并行、串行;
                數(shù)據(jù)集快照:一個(gè)時(shí)間點(diǎn)上,數(shù)據(jù)在所有數(shù)據(jù)集上的分布情況;
                星型模式元數(shù)據(jù):事實(shí)表、維度、屬性、層次等;
                報(bào)表語(yǔ)義層:報(bào)表指標(biāo)的規(guī)則、過(guò)濾條件物理名稱(chēng)和業(yè)務(wù)名稱(chēng)的對(duì)應(yīng);
                數(shù)據(jù)訪(fǎng)問(wèn)日志:哪些數(shù)據(jù)何時(shí)被何人訪(fǎng)問(wèn);
                質(zhì)量稽核日志:何時(shí)、何度量被稽核,其結(jié)果;
                數(shù)據(jù)裝載日志:哪些數(shù)據(jù)何時(shí)被何人裝載;

          五、元數(shù)據(jù)開(kāi)發(fā)應(yīng)用的標(biāo)準(zhǔn)化框架

                1、數(shù)字圖書(shū)館資源組織框架


                2. 元數(shù)據(jù)開(kāi)發(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ù)字化資源有機(jī)構(gòu)成的信息體系(如數(shù)字圖書(shū)館)提供整合的工具與紐帶。

                離開(kāi)元數(shù)據(jù)的數(shù)字圖書(shū)館將是一盤(pán)散沙,將無(wú)法提供有效的檢索和處理。

                3. 元數(shù)據(jù)應(yīng)用環(huán)境

                3.1 Metadata的應(yīng)用目的

                (1)確認(rèn)和檢索(Discovery andentification),主要致力于如何幫助人們檢索和確認(rèn)所需要的資源,數(shù)據(jù)元素往往限于作者、標(biāo)題、主題、位置等簡(jiǎn)單信息,Dublin Core是其典型代表。

                (2)著錄描述(Cataloging),用于對(duì)數(shù)據(jù)單元進(jìn)行詳細(xì)、全面的著錄描述,數(shù)據(jù)元素囊括內(nèi)容、載體、位置與獲取方式、制作與利用方法、甚至相關(guān) 數(shù)據(jù)單元方面等,數(shù)據(jù)元素?cái)?shù)量往往較多,MARC、GILS和FGDC/CSDGM是這類(lèi)Metadata的典型代表。

                (3)資源管理(Resource Administration),支持資源的存儲(chǔ)和使用管理,數(shù)據(jù)元素除比較全面的著錄描述信息外,還往往包括權(quán)利管理(Rights/Privacy Management)、電子簽名(Digital Signature)、資源評(píng)鑒(Seal of Approval/Rating)、使用管理(Access Management)、支付審計(jì)(Payment and Accounting)等方面的信息。

                (4)資源保護(hù)與長(zhǎng)期保存(Preservation and Archiving),支持對(duì)資源進(jìn)行長(zhǎng)期保存,數(shù)據(jù)元素除對(duì)資源進(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ù)特點(diǎn)和應(yīng)用需要,90年代以來(lái),許多Metadata格式在各個(gè)不同領(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
          社會(huì)科學(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
          檔案庫(kù)與資源集合:EAD
          技術(shù)報(bào)告:RFC 1807
          連續(xù)圖像:MPEG-7

                3.3 Metadata格式的應(yīng)用程度

                不同領(lǐng)域的Metadata處于不同的標(biāo)準(zhǔn)化階段:
          在網(wǎng)絡(luò)資源描述方面,Dublin Core經(jīng)過(guò)多年國(guó)際性努力,已經(jīng)成為一個(gè)廣為接受和應(yīng)用的事實(shí)標(biāo)準(zhǔn);

                在政府信息方面,由于美國(guó)政府大力推動(dòng)和有關(guān)法律、標(biāo)準(zhǔn)的實(shí)行,GILS已經(jīng)成為政府信息描述標(biāo)準(zhǔn),并在世界若干國(guó)家得到相當(dāng)程度的應(yīng)用,與此類(lèi)似的還有地理空間信息處理的FGDC/CSDGM;

                但在某些領(lǐng)域,由于技術(shù)的迅速發(fā)展變化,仍然存在多個(gè)方案競(jìng)爭(zhēng),典型的是數(shù)字圖像的Metadata,現(xiàn)在提出的許多標(biāo)準(zhǔn)都處于實(shí)驗(yàn)和完善的階段。
          3.4 Metadata格式“標(biāo)準(zhǔn)化”程度問(wèn)題

            Metadata開(kāi)發(fā)應(yīng)用經(jīng)驗(yàn)表明,很難有一個(gè)統(tǒng)一的Metadata格式來(lái)滿(mǎn)足所有領(lǐng)域的數(shù)據(jù)描述需要;即使在同一個(gè)領(lǐng)域,也可能為了不同目的而需要不同的但可相互轉(zhuǎn)換的Metadata格式。

            同時(shí),統(tǒng)一的集中計(jì)劃式的Metadata格式標(biāo)準(zhǔn)也不適合Internet環(huán)境,不利于充分利用市場(chǎng)機(jī)制和各方面力量。

            但在同一領(lǐng)域,應(yīng)爭(zhēng)取“標(biāo)準(zhǔn)化”,在不同領(lǐng)域,應(yīng)妥善解決不同格式的互操作問(wèn)題。

                4. 元數(shù)據(jù)結(jié)構(gòu)

                4.1 總體結(jié)構(gòu)定義方式 一個(gè)Metadata格式由多層次的結(jié)構(gòu)予以定義:

                (1)內(nèi)容結(jié)構(gòu)(Content Structure),對(duì)該Metadata的構(gòu)成元素及其定義標(biāo)準(zhǔn)進(jìn)行描述。

                (2)句法結(jié)構(gòu)(Syntax Structure),定義Metadata結(jié)構(gòu)以及如何描述這種結(jié)構(gòu)。

                (3)語(yǔ)義結(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)性元素(例如與編碼語(yǔ)言、Namespace、數(shù)據(jù)單元等的鏈接)。

                這些數(shù)據(jù)元素很可能依據(jù)一定標(biāo)準(zhǔn)來(lái)選取,因此元數(shù)據(jù)內(nèi)容結(jié)構(gòu)中需要對(duì)此進(jìn)行說(shuō)明,例如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)語(yǔ)句描述語(yǔ)言(例如EBNF Notation)等。

                有時(shí),句法結(jié)構(gòu)需要指出元數(shù)據(jù)是否與所描述的數(shù)據(jù)對(duì)象捆綁在一起、或作為單獨(dú)數(shù)據(jù)存在但以一定形式與數(shù)據(jù)對(duì)象鏈接,還可能描述與定義標(biāo)準(zhǔn)、DTD結(jié)構(gòu)和Namespace等的鏈接方式。
           
                4.4 語(yǔ)義結(jié)構(gòu) 語(yǔ)義結(jié)構(gòu)定義元素的具體描述方法,例如 描述元素時(shí)所采用的標(biāo)準(zhǔn)、最佳實(shí)踐(Best Practices)或自定義的描述要求(Instructions)。

                有些元數(shù)據(jù)格式本身定義了語(yǔ)義結(jié)構(gòu),而另外一些則由具體采用單位規(guī)定語(yǔ)義結(jié)構(gòu),例如Dublin Core建議日期元素采用ISO 8601、資源類(lèi)型采用Dublin Core Types、數(shù)據(jù)格式可采用MIME、識(shí)別號(hào)采用URL或DOI或ISBN;
          又如OhioLink在使用VRA Core時(shí)要求主題元素使用A&AT、TGM和TGN,人名元素用ULAN。
           
                5. 元數(shù)據(jù)編碼語(yǔ)言與制作方式
           
                5.1 元數(shù)據(jù)編碼語(yǔ)言

                元數(shù)據(jù)編碼語(yǔ)言(Metadata Encoding Languages)指對(duì)元數(shù)據(jù)元素和結(jié)構(gòu)進(jìn)行定義和描述的具體語(yǔ)法和語(yǔ)義規(guī)則,常稱(chēng)為定義描述語(yǔ)言(DDL)。

                在元數(shù)據(jù)發(fā)展初期人們常使用自定義的記錄語(yǔ)言(例如MARC)或數(shù)據(jù)庫(kù)記錄結(jié)構(gòu)(如ROADS等),但隨著元數(shù)據(jù)格式的增多和互操作的要求,人們開(kāi)始采用一些標(biāo)準(zhǔn)化的DDL來(lái)描述元數(shù)據(jù),例如SGML和XML,其中以XML最有潛力。
           
                5.2 元數(shù)據(jù)制作方式

          (1)專(zhuān)門(mén)編制模塊(例如對(duì)MARC、GILS、FGDC等)

          (2)數(shù)據(jù)處理時(shí)自動(dòng)編制(例如對(duì)Dublin Core等)

          (3)數(shù)據(jù)物理處理時(shí)自動(dòng)編制(例如數(shù)字圖像掃描時(shí)的某些元數(shù)據(jù)參數(shù))

          (4)共享元數(shù)據(jù)(例如OCLC/CORC、IMESH
           
                6. 元數(shù)據(jù)互操作性

                6.1 元數(shù)據(jù)互操作性問(wèn)題

                由于不同的領(lǐng)域(甚至同一領(lǐng)域)往往存在多個(gè)元數(shù)據(jù)格式,當(dāng)在用不同元數(shù)據(jù)格式描述的資源體系之間進(jìn)行檢索、資源描述和資源利用時(shí),就存在元數(shù)據(jù)的互操作性問(wèn)題(Interoperability):
          多個(gè)不同元數(shù)據(jù)格式的釋讀、轉(zhuǎn)換和由多個(gè)元數(shù)據(jù)格式描述的數(shù)字化信息資源體系之間的透明檢索。
           
                6.2 元數(shù)據(jù)格式映射

               利用特定轉(zhuǎn)換程序?qū)Σ煌獢?shù)據(jù)元格式進(jìn)行轉(zhuǎn)換,稱(chēng)為元數(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

                也可利用一種中介格式對(duì)同一格式框架下的多種元數(shù)據(jù)格式進(jìn)行轉(zhuǎn)換,例如UNIverse項(xiàng)目利用GRS格式進(jìn)行各種MARC格式和其它記錄格式的轉(zhuǎn)換。格 式映射轉(zhuǎn)換準(zhǔn)確、轉(zhuǎn)換效率較高。不過(guò),這種方法在面對(duì)多種元數(shù)據(jù)格式并存的開(kāi)放式環(huán)境中的應(yīng)用效率明顯受到限制。
           
                6.3 標(biāo)準(zhǔn)描述框架

                解決元數(shù)據(jù)互操作性的另一種思路是建立一個(gè)標(biāo)準(zhǔn)的資源描述框架,用這個(gè)框架來(lái)描述所有元數(shù)據(jù)格式,那么只要一個(gè)系統(tǒng)能夠解析這個(gè)標(biāo)準(zhǔn)描述框架,就能解讀相應(yīng)的Metadata格式. 實(shí)際上,XML和RDF從不同角度起著類(lèi)似的作用。

                XML通過(guò)其標(biāo)準(zhǔn)的DTD定義方式,允許所有能夠解讀XML語(yǔ)句的系統(tǒng)辨識(shí)用XML_DTD定義的Metadata格式,從而解決對(duì)不同格式的釋讀問(wèn)題。

                RDF定義了由Resources、Properties和Statements等三種對(duì)象組成的基本模型,其中Resources和Properties關(guān)系類(lèi)似于E-R模型,而Statements則對(duì)該關(guān)系進(jìn)行具體描述。

                RDF通過(guò)這個(gè)抽象的數(shù)據(jù)模型為定義和使用元數(shù)據(jù)建立一個(gè)框架,元數(shù)據(jù)元素可看成其描述的資源的屬性。

                進(jìn)一步地,RDF定義了標(biāo)準(zhǔn)Schema,規(guī)定了聲明資源類(lèi)型、聲明相關(guān)屬性及其語(yǔ)義的機(jī)制,以及定義屬性與其它資源間關(guān)系的方法。另外,RDF還規(guī)定了利用XML Namespace方法調(diào)用已有定義規(guī)范的機(jī)制,
           
                6.4 數(shù)字對(duì)象方式

                建立包含元數(shù)據(jù)及其轉(zhuǎn)換機(jī)制的數(shù)字對(duì)象可能從另一個(gè)角度解決元數(shù)據(jù)互操作性問(wèn)題。

                Cornell/FEDORA項(xiàng)目提出由內(nèi)核(Structural Kernel)和功能傳播層(Disseminator Layer)組成的復(fù)合數(shù)字對(duì)象。

                內(nèi)核里,可以容納以比特流形式存在的文獻(xiàn)內(nèi)容、描述該文獻(xiàn)的元數(shù)據(jù)、以及對(duì)這個(gè)文獻(xiàn)及元數(shù)據(jù)進(jìn)行存取控制的有關(guān)數(shù)據(jù)。

                功能傳播層,主功能傳播器(PrimitiveDisseminator)支持有關(guān)解構(gòu)內(nèi)核數(shù)據(jù)類(lèi)型和對(duì)內(nèi)核數(shù)據(jù)讀取的服務(wù)功能,還可有內(nèi)容類(lèi)型傳播器(Content-Type Disseminators),它們可內(nèi)嵌元數(shù)據(jù)格式轉(zhuǎn)換機(jī)制。

                例如,在一個(gè)數(shù)字對(duì)象的內(nèi)核中存有MARC格式的元數(shù)據(jù),在功能傳播層裝載有請(qǐng)求Dublin Core格式及其轉(zhuǎn)換服務(wù)的內(nèi)容類(lèi)型傳播器。當(dāng)數(shù)字對(duì)象使用者要求讀取以Dublin Core表示的元數(shù)據(jù)時(shí),相應(yīng)的內(nèi)容類(lèi)型傳播器將通過(guò)網(wǎng)絡(luò)請(qǐng)求存儲(chǔ)有Dublin Core及其轉(zhuǎn)換服務(wù)程序的數(shù)字對(duì)象,然后將被請(qǐng)求數(shù)字對(duì)象中的MARC形式元數(shù)據(jù)轉(zhuǎn)換為Dublin Core形式,在輸出給用戶(hù)。

                7. 幾點(diǎn)建議
           
                跟蹤元數(shù)據(jù)發(fā)展、積極參與制定元數(shù)據(jù)標(biāo)準(zhǔn)、加快元數(shù)據(jù)應(yīng)用、注意國(guó)際接軌。
                加快研究有效利用元數(shù)據(jù)進(jìn)行檢索(包括異構(gòu)系統(tǒng)透明檢索)、相關(guān)性學(xué)習(xí)、個(gè)性化處理等的機(jī)制。
                加快研究元數(shù)據(jù)與數(shù)字對(duì)象和數(shù)字化資源體系有機(jī)整合的途徑與方法。
                推進(jìn)研究利用元數(shù)據(jù)進(jìn)行基于知識(shí)的數(shù)據(jù)組織和知識(shí)發(fā)現(xiàn)。

          **************************************

          元數(shù)據(jù)接口使用詳解

          *******************************

          三個(gè)元數(shù)據(jù)接口DatabaseMetaData、ResultSetMetaData和ParameterMetaData接口是三個(gè)常用的元 數(shù)據(jù)接口。DatabaseMetaData提供與數(shù)據(jù)庫(kù)或者DBMS相關(guān)的信息;ResultSetMetaData對(duì)象提供與特定ResultSet 實(shí)例中與列相關(guān)的信息;ParameterMetaData對(duì)象提供與PreparedStatement對(duì)象的參數(shù)有關(guān)的信息。本文討論的內(nèi)容并不僅限 于JDBC的某個(gè)版本,而是基于1.0—3.0的規(guī)范進(jìn)行學(xué)習(xí)。
          • ResultSetMetaData對(duì)象
            當(dāng)在JDBC應(yīng)用程序中發(fā)送select語(yǔ)句時(shí),該操作會(huì)返回一個(gè)ResultSet對(duì)象,這個(gè)ResultSet對(duì)象包含滿(mǎn)足條件的數(shù)據(jù)。通過(guò)創(chuàng)建 ResultMetaData對(duì)象和調(diào)用該對(duì)象的方法,可以獲取與這個(gè)ResultSet對(duì)象中的列有關(guān)的信息。下面的代碼段將創(chuàng)建ResultSet對(duì) 象rs,然后使用rs來(lái)創(chuàng)建ResultSetMetaData對(duì)象,所創(chuàng)建的ResultSetMetaData對(duì)象包含與rs中的列有關(guān)的信息。
                 Statement stmt= con . createStatement();
            ResultSet rs = stmt.executeQuery(“select * from sales”);
            ResultSetMetaData rsmd = rs.getMetaData();
            現(xiàn)在可以使用rsmd調(diào)用ResultSetMetaData的方法來(lái)訪(fǎng)問(wèn)與rs中的列有關(guān)的信息。除了方法 getColumnCount給出結(jié)果集中總的列數(shù)外,所有的ResultSetMetaData方法都返回與單個(gè)列有關(guān)的信息,并都接受一個(gè)表示對(duì)應(yīng)列 號(hào)的參數(shù)。
            1. 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 ” ++”:   ” ++”  ”);
              8    }
              9  }

              需要注意的是,用于檢索所有列值的ResultSet方法是getString。當(dāng)不知道每一列的類(lèi)型,這是比較容易的方法;如果希望能檢索所有的數(shù)據(jù)類(lèi)型(包括SQL 99數(shù)據(jù)型),則可以使用方法getObject,這是保證能夠檢索所有列值得唯一方法。
            2. 獲取列類(lèi)型信息
              有兩個(gè)ResultSetMetaData方法可以獲取與結(jié)果集列的類(lèi)型有關(guān)的信息。這兩個(gè)方法是getColumnType和 getColumnTypeName。getColumnType方法用于確定存儲(chǔ)在指定列中的值的JDBC類(lèi)型。該方法以一個(gè)int值來(lái)返回JDBC類(lèi) 型。如下面的代碼獲得rs第二列的JDBC類(lèi)型:
                  ResultSetMetaData rsmd = rs.getMetaData();
              int jdbcType = rsmd.getColumnType(2);
            3. 獲取其他信息
                另外有幾個(gè)方法用來(lái)提供與存儲(chǔ)數(shù)值類(lèi)型的列有關(guān)的信息。
              isAutoIncrement
              isCurrency
              isSigned
              getPrecision
              getScale
              isNullable
              getColumnDisplaySize
            1. 使用DatabaseMetaData對(duì)象
                接口DatabaseMetaData提供了大量的方法取得與數(shù)據(jù)庫(kù)相關(guān)的信息。一旦獲得了打開(kāi)的連接,就可以創(chuàng)建包含與數(shù)據(jù)庫(kù)系統(tǒng)有關(guān)的信息的DatabaseMetaData對(duì)象。
            2. DatabaseMetaData方法的類(lèi)別
                按照返回值的類(lèi)型對(duì)DatabaseMetaData的方法進(jìn)行分類(lèi),可以分為4種。
                有三種類(lèi)型返回單一的值,另外一種返回一個(gè)結(jié)果集,這個(gè)結(jié)果集包含1~18列的數(shù)據(jù)。
            3. ① 返回String的方法
                最小的類(lèi)別是指返回String對(duì)象的DatabaseMetaData方法。這些方法中的一些方法可以獲取與DBMS有關(guān)的總體信息,包括數(shù)據(jù)庫(kù)的URL、username、產(chǎn)品名稱(chēng)、驅(qū)動(dòng)程序信息等等。
              ② 返回int的方法
              ③ 返回boolean的方法
              ④返回ResultSet對(duì)象的方法
              這些方法可以返回ResultSet對(duì)象,所返回的ResultSet對(duì)象可以包含1到最多18列。
            4. 獲取與主外鍵有關(guān)的信息
                返回與主外鍵有關(guān)信息的方法主要有g(shù)etPrimaryKeys、getImportedKeys、getExportedKeys以及getCrossReference等。
                下面的代碼段顯示了如果在定義表時(shí)指定了主鍵,則可以調(diào)用方法getPrimaryKeys開(kāi)獲取對(duì)于表中主鍵列的描述。
                      
               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 }

              如果主鍵多余一列的話(huà),那么方法getPrimaryKeys等將詳細(xì)描述每一列。列key_seq中的值表示描述的是哪一列。
          • 使用ParameterMetaData對(duì)象

              可以使用ParameterMetaData對(duì)象來(lái)獲取與PreparedStatement對(duì)象或者CallableStatement對(duì)象 有關(guān)的信息。這些參數(shù)由”?”占位符表示,”?”占位符是提供給Connection方法prepareStatement和prepareCall的 SQL語(yǔ)句。下面的代碼行使用兩個(gè)參數(shù)占位符來(lái)創(chuàng)建一個(gè)PreparedStatement對(duì)象。
              PreparedStatement pstmt=con.prepareStatement(“select id from employees where dept=? and salary>?”);
            這些參數(shù)根據(jù)其序號(hào)來(lái)編號(hào),因此第一個(gè)參數(shù)編號(hào)1,第二個(gè)參數(shù)編號(hào)2,依此類(lèi)推。在上面的代碼行中,參數(shù)1是列dept中的一個(gè)值,參數(shù)2是 salary中的一個(gè)值。下面的代碼段用于找出PreparedStatement pstmt有多少個(gè)參數(shù)。首先創(chuàng)建pstmt并用它來(lái)創(chuàng)建ParameterMetaData對(duì)象pmd,這個(gè)對(duì)象包含與pstmt中的參數(shù)有關(guān)的信息。 接著調(diào)用pmd上的方法getColumnCount來(lái)找出pstmt有多少參數(shù)。

                
            1     PreparedStatement pstmt=con.prepareStatement(
            2      “update employees set salary =? Where level=?”);
            3     ParameterMetaData pmd = pstmt.getParameterMetaData();
            4     int count=pmd.getParameterCount();

            變量count的值應(yīng)該等于2。方法getParameterCount不接受參數(shù),因?yàn)樗祷嘏cPreparedStatement對(duì)象的所有參數(shù)有關(guān)的信息。ParameterMetaData接口中的所有其他方法都接受序號(hào)來(lái)表示作為要查詢(xún)的信息的參數(shù)。
          ******************************
          補(bǔ)充說(shuō)明數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)
          ******************************

          一旦連接到數(shù)據(jù)庫(kù),就可以請(qǐng)求表名以及表列的名稱(chēng)和內(nèi)容等信息,而且您可以運(yùn)行 SQL 語(yǔ)句來(lái)查詢(xún)數(shù)據(jù)庫(kù)或者添加或修改其內(nèi)容。可用來(lái)從數(shù)據(jù)庫(kù)中獲取信息的對(duì)象有:

          DatabaseMetaData 有關(guān)整個(gè)數(shù)據(jù)庫(kù)的信息:表名、表的索引、數(shù)據(jù)庫(kù)產(chǎn)品的名稱(chēng)和版本、數(shù)據(jù)庫(kù)支持的操作。
          ResultSet 關(guān)于某個(gè)表的信息或一個(gè)查詢(xún)的結(jié)果。您必須逐行訪(fǎng)問(wèn)數(shù)據(jù)行,但是您可以任何順序訪(fǎng)問(wèn)列。
          ResultSetMetaData 有關(guān)ResultSet中列的名稱(chēng)和類(lèi)型的信息。

          盡管每個(gè)對(duì)象都有大量的方法讓您獲得數(shù)據(jù)庫(kù)元素的極為詳細(xì)的信息,但在每個(gè)對(duì)象中都有幾種主要的方法使您可獲得數(shù)據(jù)的最重要信息。然而,如果您希望看到比此處更多的信息,建議您學(xué)習(xí)文檔以獲得其余方法的說(shuō)明。

          · ResultSet

          ResultSet 對(duì)象是 JDBC 中最重要的單個(gè)對(duì)象。從本質(zhì)上講,它是對(duì)一個(gè)一般寬度和未知長(zhǎng)度的表的一種抽象。幾乎所有的方法和查詢(xún)都將數(shù)據(jù)作為 ResultSet 返回。 ResultSet 包含任意數(shù)量的命名列,您可以按名稱(chēng)訪(fǎng)問(wèn)這些列。它還包含一個(gè)或多個(gè)行,您可以按順序自上而下逐一訪(fǎng)問(wèn)。在您使用 ResultSet 之前,必須查詢(xún)它包含多少個(gè)列。此信息存儲(chǔ)在 ResultSetMetaData 對(duì)象中。

          // 從元數(shù)據(jù)中獲得列數(shù) ResultSetMetaData rsmd; rsmd = results.getMetaData(); numCols = rsmd.getColumnCount();

          當(dāng)您獲得一個(gè)ResultSet時(shí),它正好指向第一行之前的位置。您可以使用 next() 方法得到其他每一行,當(dāng)沒(méi)有更多行時(shí),該方法會(huì)返回 false 。由于從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)可能會(huì)導(dǎo)致錯(cuò)誤,您必須始終將結(jié)果集處理語(yǔ)句包括在一個(gè) 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ù),這取決于每個(gè)列中存儲(chǔ)的數(shù)據(jù)類(lèi)型。另外,您可以按列序號(hào)或列名獲取列的內(nèi)容。請(qǐng)注意,列序號(hào)從 1 開(kāi)始,而不是從 0 開(kāi)始。 ResultSet 對(duì)象的一些最常用方法如下所示。

          getInt(int); 將序號(hào)為 int 的列的內(nèi)容作為整數(shù)返回。
          getInt(String); 將名稱(chēng)為 String 的列的內(nèi)容作為整數(shù)返回。
          getFloat(int); 將序號(hào)為 int 的列的內(nèi)容作為一個(gè) float 型數(shù)返回。
          g<tt>etFloat(String);</tt> 將名稱(chēng)為 String 的列的內(nèi)容作為 float 型數(shù)返回。
          getDate(int); 將序號(hào)為 int 的列的內(nèi)容作為日期返回。
          getDate(String); 將名稱(chēng)為 String 的列的內(nèi)容作為日期返回。
          next(); 將行指針移到下一行。如果沒(méi)有剩余行,則返回 false 。
          close(); 關(guān)閉結(jié)果集。
          getMetaData(); 返回 ResultSetMetaData 對(duì)象。

          · ResultSetMetaData

          您使用 getMetaData() 方法從 ResultSet 中獲取 ResultSetMetaData 對(duì)象。您可以使用此對(duì)象獲得列的數(shù)目和類(lèi)型以及每一列的名稱(chēng)。

          getColumnCount();
          返回 ResultSet 中的列數(shù)。
          getColumnName(int); 返回列序號(hào)為 int 的列名。
          getColumnLabel(int); 返回此列暗含的標(biāo)簽。
          isCurrency(int); 如果此列包含帶有貨幣單位的一個(gè)數(shù)字,則返回 true 。
          isReadOnly(int); 如果此列為只讀,則返回 true 。
          isAutoIncrement(int); 如果此列自動(dòng)遞增,則返回 true 。這類(lèi)列通常為鍵,而且始終是只讀的。
          getColumnType(int); 返回此列的SQL數(shù)據(jù)類(lèi)型。這些數(shù)據(jù)類(lèi)型包括

          BIGINT
          BINARY
          BIT
          CHAR
          DATE
          DECIMAL
          DOUBLE
          FLOAT
          INTEGER
          LONGVARBINARY
          LONGVARCHAR

          NULL
          NUMERIC
          OTHER
          REAL
          SMALLINT
          TIME
          TIMESTAMP
          TINYINT
          VARBINARY
          VARCHAR

          · DatabaseMetaData

          DatabaseMetaData對(duì)象可為您提供整個(gè)數(shù)據(jù)庫(kù)的信息。您主要用它獲取數(shù)據(jù)庫(kù)中表的名稱(chēng),以及表中列的名稱(chēng)。由于不同的數(shù)據(jù)庫(kù)支持不同的 SQL 變體,因此,也有多種方法查詢(xún)數(shù)據(jù)庫(kù)支持哪些 SQL 方法。
          getCatalogs() 返回該數(shù)據(jù)庫(kù)中的信息目錄列表。使用 JDBC-ODBC Bridge 驅(qū)動(dòng)程序,您可以獲得用 ODBC 注冊(cè)的數(shù)據(jù)庫(kù)列表。這很少用于 JDBC-ODBC 數(shù)據(jù)庫(kù)。
          getTables(catalog, schema, tableNames, columnNames) 返回表名與 tableNames 相符而且列名與 columnNames 相符的所有表的說(shuō)明。
          getColumns(catalog, schema, tableNames,columnNames) 返回表名與 tableNames 相符而且列名與 columnNames 相符的所有表列說(shuō)明。
          getURL(); 獲得您所連接的URL名稱(chēng)。
          getDriverName(); 獲得您所連接的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序的名稱(chēng)。

          · 獲取有關(guān)表的信息

          您可以使用 DataBaseMetaData 的 getTables() 方法來(lái)獲取數(shù)據(jù)庫(kù)中表的信息。這個(gè)方法有如下 4 個(gè) String 參數(shù):

          results =
          dma.getTables(catalog, schema, tablemask, types[]);

          其中參數(shù)的意義是:

          catalog 要在其中查找表名的目錄名。對(duì)于 JDBC-ODBC 數(shù)據(jù)庫(kù)以及許多其他數(shù)據(jù)庫(kù)而言,可將其設(shè)置為 null。這些數(shù)據(jù)庫(kù)的目錄項(xiàng)實(shí)際上是它在文件系統(tǒng)中的絕對(duì)路徑名稱(chēng)。
          schema 要包括的數(shù)據(jù)庫(kù)“方案”。許多數(shù)據(jù)庫(kù)不支持方案,而對(duì)另一些數(shù)據(jù)庫(kù)而言,它代表數(shù)據(jù)庫(kù)所有者的用戶(hù)名。一般將它設(shè)置為 null 。
          tablemask 一個(gè)掩碼,用來(lái)描述您要檢索的表的名稱(chēng)。如果您希望檢索所有表名,則將其設(shè)為通配符 % 。 請(qǐng)注意, SQL 中的通配符是 % 符號(hào),而不是一般PC用戶(hù)的*符號(hào)。
          types[] 這是描述您要檢索的表的類(lèi)型的String數(shù)組。數(shù)據(jù)庫(kù)中通常包括許多用于內(nèi)部處理的表,而對(duì)作為用戶(hù)的您沒(méi)什么價(jià)值。如果它是空值,則您會(huì)得到所有這些表。如果您將其設(shè)為包含字符串“ TABLES ”的單元素?cái)?shù)組,您將僅獲得對(duì)用戶(hù)有用的表格。

          用于從數(shù)據(jù)庫(kù)中獲取表名的簡(jiǎn)單代碼相當(dāng)于獲取 DatabaseMetaData 對(duì)象,并從其中檢索表名:

          con = DriverManager.getConnection(url);
          //獲取數(shù)據(jù)庫(kù)的元數(shù)據(jù)

          dma =con.getMetaData();
          //將數(shù)據(jù)庫(kù)中的表的名稱(chēng)轉(zhuǎn)儲(chǔ)出來(lái)

          String[] types = new String[1];
          types[0] = ”TABLES”; //設(shè)置查詢(xún)類(lèi)型

          //請(qǐng)注意通配符是
          % 符號(hào)(而不是
          “*”)

          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();
          }
          如前文所述,將所有代碼包括在 try 塊中。

          posted on 2007-04-12 23:58 wqwqwqwqwq 閱讀(1723) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Simple Java
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345




          常用鏈接

          留言簿(10)

          隨筆分類(lèi)(95)

          隨筆檔案(97)

          文章檔案(10)

          相冊(cè)

          J2ME技術(shù)網(wǎng)站

          java技術(shù)相關(guān)

          mess

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          校園夢(mèng)網(wǎng)網(wǎng)絡(luò)電話(huà),中國(guó)最優(yōu)秀的網(wǎng)絡(luò)電話(huà)
          主站蜘蛛池模板: 尼勒克县| 武宣县| 新邵县| 赣州市| 梁山县| 莱州市| 临潭县| 灵丘县| 巴彦淖尔市| 温宿县| 双牌县| 阿拉善左旗| 上饶县| 利津县| 汕尾市| 凤山县| 利川市| 汝南县| 天柱县| 古田县| 溧阳市| 土默特右旗| 鲜城| 昌宁县| 即墨市| 南开区| 望城县| 逊克县| 青铜峡市| 德州市| 南郑县| 建瓯市| 安塞县| 望奎县| 荆门市| 锡林浩特市| 安乡县| 衡东县| 达州市| 邻水| 竹溪县|