<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-47  評論-14  文章-0  trackbacks-0

                                                   字符大對象Blob

    Blob對象是SQL BlobJava語言映射。SQL Blob是一個內置類型,它可以將一個二進制大對象保存在數據庫中。接口ResultSetCallableStatementPreparedStatement中的方法允許程序員使用與訪問SQL 92內置類型同樣的方式來訪問SQL 99類型BLOB

    在標準實現中,JDBC驅動程序在后臺使用SQL類型LOCATOR(BLOB)來實現Blob接口。LOCATOR(BLOB)指向保存在數據庫服務器上的SQL BLOB值,而且這些操作作用在這個LOCATOR(定位器)上與作用在BLOB值本身有同樣的結果。這意味著用戶可以在一個Blob實例上執行操作而不必將這個BLOB數據物化到用戶上,這將顯著的提高性能。因為驅動程序在后臺使用LOCATOR(BLOB),所以它的使用對程序員是完全透明的。

    Blob實例的標準行為一直保持有效,直到這個事務(創建一個Blob的事務)執行了提交或者回滾操作。

    1、創建Blob對象

    下面的代碼說明了如何創建一個Blob對象,其中stmt是一個Statement對象:

    Statement stmt = con..createStatement(ResultSet.TYPE_INSENSITIVE,

    ResultSet.CONCUR_READ_ONLY);

    ResultSet rs = stmt.excuteQuery(“SELECT DATA  FROM  TABLE 1”);

    If (rs.next()){

    rs.first();

    Blob blob=rs.getBlob(“DATA”);

    }

    變量blob包含一個指向BLOB值的邏輯指針,該BLOB值保存在結果集rs的第一行的DATA列中。即使變量blob實際上并不包含BLOB值中的數值,應用程序在blob上執行操作仍然像在實際的數據上執行一樣。即應用程序在blob上所作的任何操作都會對表中的BLOB值起作用。

    2、物化BLOB數據

    開發人員可以在Blob對象上調用JDBC API中的方法,就像這些方法直接在該對象所指向的SQL BLOB上執行操作一樣。然而,如果想在BLOB數據上執行操作,就必須首先將BLOB數據物化到客戶。Blob接口提供了兩個方法來物化BLOB數據:getBinaryStream,這個方法將BLOB數據物化為一個輸入流;getBytes,這個方法將BLOB值得一部分或者全部物化為一個字節數組。下面的代碼說明了如何將Blob所指向的BLOB值得全部物化為一個輸入流: 

    java.io.InputStream in = blob.getBinaryStream();

    byte b;

    while((b = in.read()) >-1){

    System.out.println(b);

    }

    接下來的代碼同樣物化了blob所指向的BLOB值得所有數據,但是它產生的是字節數組而不是輸入流。

    long len = blob.length();

    byte [] data = blob.getBytes(1,len);

    for(int i=0;i<len;i++){

        byte b = data[i];

        System.out.println(b);

    }

    變量data復制了blob所指向的BLOB值的所有字節。這是因為傳遞給方法getBytes的參數值說明了整個BLOB值:第一個參數表示從第一個字節開始返回字節,第二個參數說明它返回的字節長度是BLOB值的長度。

    需要說明的是,因為SQLJava語言之間的不同,一個BLOB值得第一個字節在位置1,而Java數組的第一個元素的索引是0。

    3、存儲Blob

    若要在數據庫中存儲Blob值,應用程序可以把它作為一個參數傳遞給PreparedStatement的方法setBlob。下面的代碼就實現了這個功能:

    Blob stats = rs.getBlob(“STATS”);

    PreparedStatement pstmt= con.preparedStatement( “UPDATE SIGHTINGS SET MEAS= ? WHERE  AREA = ‘BEIJING’ ”);

    pstmt.setBlob(1,stats);

    pstmt.excuteUpdate();

    4、發現Blob對象中的模式如果一個Blob對象包含一個給定的字節集合,應用程序可以使用方法position的兩個方法來找到它。其中一個方法搜索一個給定的字節數組,而另一個在一個Blob對象中搜索一個給定的Blob對象。如果發現一個匹配的結果,則返回該模式字節的起始位置。

    5、修改Blob對象的方法

    JDBC 3.0 API中新增的方法setBytessetBinaryStream允許應用程序對Blob對象進行修改。

    方法setBytes有兩個方法來向Blob對象添加數據。其中一個方法增加給定的字節數組的全部內容,而另一個方法增加給定字節數組的特定部分。兩個方法都使用一個參數說明向Blob對象插入數據的起始位置。例如,下面的代碼段在一個Blob對象blob1的第一個字節處寫入整個字節數組bytes。在這種情況下,bytes包含了Blob對象blob的所有字節,因此執行的結果是blob2被寫入了blob1的起始處。需要注意的是如果blob2的長度是1024字節,那么blob21024各字節將覆蓋blob1的開頭的1024各字節。

    byte [] bytes = blob2.getBytes(1,blob2.length());

    blob.setBytes(1,bytes,0,512);

    下面的代碼段說明如何僅僅向Blob對象加入一個字節數組的特定部分。在這種情況下,方法setBytes接受兩個附加的參數來說明需要增加字節數組的哪一個部分。其中一個參數指明了這個字節數組的起始偏移量,另一個參數說明這個字節數組包含多少個連續的字節。

    byte [] bytes={……};

    blob.setBytes(1,bytes,0,512); 

    除了可以向Blob對象增加字節之外,Blob接口還提供了刪除字節的方法。方法truncate接受一個字節數目作為一個參數并且根據這個數目來縮短Blob對象。

    6、定位器和更新

    在標準實現中,指向SQL BLOBBlob對象使用了SQL LOCATOR類型。定位器(locator)是一個指向保存在數據庫中的BLOB值的指針,而DBMS如何更新一個作為定位器實現的對象則依賴于具體的數據庫。某些DBMS會更新表中的BLOB值,而另一些則僅僅更新BLOB值的一個副本,并不改變數據庫中的值。在后一種情況下,應用程序必須直接更新BLOb值。

    為了發現DBMS是如何更新BLOB值的,應用程序可以調用DatabaseMetaData的方法locatorsUpdateCopy。如果這個方法返回true,則應用程序必須自己更新數據庫中的BLOB值。下面的代碼顯示了這個過程:首先從rs取回Blob對象,然后把它的值改為字節數據val的值。如果方法locatorsUpdateCopy返回true,那么它隨后執行一個PreparedStatement對象來更新數據庫中的值。如果方法locatorsUpdateCopy返回false,代碼什么也不用做,因為數據庫中的值已經被更新過了。

    byte [] val ={0,1,2,3,4};

    Blob data =rs.getBlob(“DATA”);

    int numWritten = data.setBytes(1,val);

    if (dbmd.locatorUpdateCopy() == true){

    PreparedStatement pstmt= con . preparedStatement( “UPDATE statistics SET DATA = ? WHERE REGION = ‘BEIJING’ “);

    pstmt.setBlob(“DATA”,data);

    pstmt.executeUpdate();

    }

     

                                              字符大對象Clob

    1、創建Blob對象

    下面的代碼段說明了如何創建一個Clob對象,其中rs是一個ResultSet對象:Clob clob = rs.getClob(1); 變量clob現在可以被用于在CLOB值上執行操作,而假設這CLOB值保存在結果集rs的第一列中。

    2、物化Clob數據

    和物化Blob的方式一樣。不過Clob接口提供了三種方法達到將CLOB為一個Java對象的形式保存在客戶的內存中。

        使用getAsiiStream把CLOB值物化為一個包含Ascii字節的字符流。

    Clob notes = rs.getClob(“NOTES”);

    java.io.InputStream in = notes.getAsciiStream();

    byte b = in.read();

        使用getCharacterStream把CLOB值物化為一個Unicode字符流。

    Clob notes = rs.getClob(“NOTES”);

    java.io.Reader reader = notes.getCharacterStream();

    int c = reader.read();

        使用getSubString將CLOB值的全部或者部分化為一個String對象。

    Clob notes = rs.getClob(4);

    String substring= notes.getSubString(10,5);

    或者

    long len =notes.length();

    String substring = notes.getSubString(1,(int)len);

    3、存儲、更新Clob對象

    和存儲、更新Blob對象類似。

    posted on 2005-11-20 00:19 Stephen 閱讀(706) 評論(0)  編輯  收藏 所屬分類: DB
    主站蜘蛛池模板: 最近免费中文字幕大全免费版视频| 麻豆国产精品免费视频| 国产av天堂亚洲国产av天堂| 3d成人免费动漫在线观看| 亚洲无人区码一二三码区别图片| 免费a级毛片无码av| 99精品一区二区免费视频| 亚洲成a∨人片在无码2023 | 无码少妇一区二区浪潮免费| 国产成人亚洲毛片| 亚洲av日韩av无码| 午夜免费福利网站| 成人性生交大片免费看好| 亚洲欧美日韩中文高清www777| 亚洲中文字幕成人在线| h视频在线免费看| A毛片毛片看免费| 亚洲中文字幕久久久一区| 国产AV无码专区亚洲AV毛网站| 成年性羞羞视频免费观看无限| 成在线人视频免费视频| 亚洲国产成人无码av在线播放| 亚洲最大av无码网址| 好爽又高潮了毛片免费下载| 毛片在线播放免费观看| 爱情岛论坛免费视频| 2020年亚洲天天爽天天噜| 亚洲成AV人片在线观看无码 | 国产亚洲午夜高清国产拍精品| 成人免费福利电影| 日本视频在线观看永久免费| 美女隐私免费视频看| 亚洲视频无码高清在线| 亚洲AV成人精品网站在线播放 | 亚洲精品无码aⅴ中文字幕蜜桃| 无码久久精品国产亚洲Av影片| 亚洲国产成人精品91久久久| 最近免费中文字幕4| 亚洲免费视频观看| 一级毛片在线免费观看| 久青草视频在线观看免费|