posts - 97,  comments - 93,  trackbacks - 0
          元數(shù)據(jù)是利用JDBC創(chuàng)建和操作數(shù)據(jù)庫對象的一個很重要的概念和應(yīng)用,所以今天我特地的找了一些詳細(xì)解析個概念的資料,和利用java來操作的實例。
          ***************************************
          首先呢,當(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ù)接口使用詳解

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

          三個元數(shù)據(jù)接口DatabaseMetaData、ResultSetMetaData和ParameterMetaData接口是三個常用的元 數(shù)據(jù)接口。DatabaseMetaData提供與數(shù)據(jù)庫或者DBMS相關(guān)的信息;ResultSetMetaData對象提供與特定ResultSet 實例中與列相關(guān)的信息;ParameterMetaData對象提供與PreparedStatement對象的參數(shù)有關(guān)的信息。本文討論的內(nèi)容并不僅限 于JDBC的某個版本,而是基于1.0—3.0的規(guī)范進(jìn)行學(xué)習(xí)。
          • 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();
            ResultSet rs = stmt.executeQuery(“select * from sales”);
            ResultSetMetaData rsmd = rs.getMetaData();
            現(xiàn)在可以使用rsmd調(diào)用ResultSetMetaData的方法來訪問與rs中的列有關(guān)的信息。除了方法 getColumnCount給出結(jié)果集中總的列數(shù)外,所有的ResultSetMetaData方法都返回與單個列有關(guān)的信息,并都接受一個表示對應(yīng)列 號的參數(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)不知道每一列的類型,這是比較容易的方法;如果希望能檢索所有的數(shù)據(jù)類型(包括SQL 99數(shù)據(jù)型),則可以使用方法getObject,這是保證能夠檢索所有列值得唯一方法。
            2. 獲取列類型信息
              有兩個ResultSetMetaData方法可以獲取與結(jié)果集列的類型有關(guān)的信息。這兩個方法是getColumnType和 getColumnTypeName。getColumnType方法用于確定存儲在指定列中的值的JDBC類型。該方法以一個int值來返回JDBC類 型。如下面的代碼獲得rs第二列的JDBC類型:
                  ResultSetMetaData rsmd = rs.getMetaData();
              int jdbcType = rsmd.getColumnType(2);
            3. 獲取其他信息
                另外有幾個方法用來提供與存儲數(shù)值類型的列有關(guān)的信息。
              isAutoIncrement
              isCurrency
              isSigned
              getPrecision
              getScale
              isNullable
              getColumnDisplaySize
            1. 使用DatabaseMetaData對象
                接口DatabaseMetaData提供了大量的方法取得與數(shù)據(jù)庫相關(guān)的信息。一旦獲得了打開的連接,就可以創(chuàng)建包含與數(shù)據(jù)庫系統(tǒng)有關(guān)的信息的DatabaseMetaData對象。
            2. DatabaseMetaData方法的類別
                按照返回值的類型對DatabaseMetaData的方法進(jìn)行分類,可以分為4種。
                有三種類型返回單一的值,另外一種返回一個結(jié)果集,這個結(jié)果集包含1~18列的數(shù)據(jù)。
            3. ① 返回String的方法
                最小的類別是指返回String對象的DatabaseMetaData方法。這些方法中的一些方法可以獲取與DBMS有關(guān)的總體信息,包括數(shù)據(jù)庫的URL、username、產(chǎn)品名稱、驅(qū)動程序信息等等。
              ② 返回int的方法
              ③ 返回boolean的方法
              ④返回ResultSet對象的方法
              這些方法可以返回ResultSet對象,所返回的ResultSet對象可以包含1到最多18列。
            4. 獲取與主外鍵有關(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 }

              如果主鍵多余一列的話,那么方法getPrimaryKeys等將詳細(xì)描述每一列。列key_seq中的值表示描述的是哪一列。
          • 使用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();

            變量count的值應(yīng)該等于2。方法getParameterCount不接受參數(shù),因為它返回與PreparedStatement對象的所有參數(shù)有關(guān)的信息。ParameterMetaData接口中的所有其他方法都接受序號來表示作為要查詢的信息的參數(shù)。
          ******************************
          補充說明數(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ù)目和類型以及每一列的名稱。

          getColumnCount();
          返回 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ù)類型包括

          BIGINT
          BINARY
          BIT
          CHAR
          DATE
          DECIMAL
          DOUBLE
          FLOAT
          INTEGER
          LONGVARBINARY
          LONGVARCHAR

          NULL
          NUMERIC
          OTHER
          REAL
          SMALLINT
          TIME
          TIMESTAMP
          TINYINT
          VARBINARY
          VARCHAR

          · 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();
          //將數(shù)據(jù)庫中的表的名稱轉(zhuǎn)儲出來

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

          //請注意通配符是
          % 符號(而不是
          “*”)

          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 閱讀(1722) 評論(0)  編輯  收藏 所屬分類: Simple Java
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345




          常用鏈接

          留言簿(10)

          隨筆分類(95)

          隨筆檔案(97)

          文章檔案(10)

          相冊

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

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

          mess

          搜索

          •  

          最新評論

          閱讀排行榜

          校園夢網(wǎng)網(wǎng)絡(luò)電話,中國最優(yōu)秀的網(wǎng)絡(luò)電話
          主站蜘蛛池模板: 大宁县| 图木舒克市| 新余市| 柳林县| 林甸县| 娄烦县| 阜新市| 敦化市| 黄梅县| 郎溪县| 黄浦区| 新民市| 于田县| 内乡县| 静海县| 新宁县| 左权县| 益阳市| 皋兰县| 连城县| 南溪县| 沙河市| 东台市| 四川省| 西乡县| 怀仁县| 响水县| 揭阳市| 永胜县| 林周县| 伊宁县| 昂仁县| 西贡区| 宣威市| 深圳市| 灵石县| 大港区| 鹿邑县| 永和县| 贡觉县| 浮梁县|