亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Blob和Clob在JDBC中的簡介

2019-11-18 16:10:14
字體:
來源:轉載
供稿:網友

        數據庫在當今的應用越來越廣泛了,同樣伴隨著領域的廣泛,存儲的內容也不在是只有數值、字符、boolean幾種類型,而是越來越多樣化。在這樣的前提下就出現了Blob和Clob兩個類型。下面我將對這個兩個類型在JDBC中的應用,進行一個簡短的介紹

        Blob是指二進制大對象也就是英文Binary Large Object的所寫,而Clob是指大字符對象也就是英文Character Large Object的所寫。由此可見這兩個類型都是用來存儲大量數據而設計的,其中BLOB是用來存儲大量二進制數據的;CLOB用來存儲大量文本數據。

        那么有人肯定要問既然已經有VARCHAR和VARBINARY兩中類型,為什么還要再使用另外的兩種類型呢?其實問題很簡單,VARCHAR和VARBINARY兩種類型是有自己的局限性的。首先說這兩種類型的長度還是有限的不可以超過一定的限額,以VARCHAR再ORA中為例長度不可以超過4000;那么有人又要問了,LONGVARCHAR類型作為數據庫中的一種存儲字符的類型可以滿足要求,存儲很長的字符,那為什么非要出現CLOB類型呢?其實如果你用過LONGVARCHAR類型就不難發現,該類型的一個重要缺陷就是不可以使用LIKE這樣的條件檢索。(稍候將介紹在CLOB中如何實現類似LIKE的模糊查找)另外除了上述的問題外,還又一個問題,就是在數據庫中VARCHAR和VARBINARY的存取是將全部內容從全部讀取或寫入,對于100K或者說更大數據來說這樣的讀寫方式,遠不如用流進行讀寫來得更現實一些。

        在JDBC中有兩個接口對應數據庫中的BLOB和CLOB類型,java.sql.Blob和java.sql.Clob。和你平常使用數據庫一樣你可以直接通過ResultSet.getBlob()方法來獲取該接口的對象。與平時的查找唯一不同的是得到Blob或Clob的對象后,我們并沒有得到任何數據,但是我們可以這兩個接口中的方法得到數據

例如:
 Blob b=resultSet.getBlob(1);
 InputStream bin=b.getBinaryStryeam();
 Clob c=resultSet.getClob(2);
 Reader cReader=c.getCharacterStream():
關于Clob類型的讀取可以使用更直接的方法,就是直接通過ResultSet.getCharacterStream();方法獲得字符流,但該方法并不安全,所以建議還是使用上面例子的方法獲取Reader。
另外還有一種獲取方法,不使用數據流,而是使用數據塊。
例如
 Blob b=resultSet.getBlob(1);
 byte data=b.getByte(0,b.length());
 Clob c=resultSet.getClob(2);
 String str=c.getSubString(0,c.length()):
在這里我要說明一下,這個方法其實并不安全,如果你很細心的話,那很容易就能發現getByte()和getSubString()兩個方法中的第二個參數都是int類型的,而BLOB和CLOB是用來存儲大量數據的。而且Bolb.length()和Clob.length()的返回值都是long類型的,所以很不安全。這里不建議使用。但為什么要在這里提到這個方法呢?稍候告訴你答案,這里你需要記住使用數據塊是一種方法。

在存儲的時候也同樣的在PReparedStatement和CallableStatememt中,以參數的形式使用setBlob()和setClob方法把Blob和Clob對象作為參數傳遞給SQL。這聽起來似乎很簡單對吧,但是并非我們想象的這樣,很不幸由于這兩個類型的特殊,JDBC并沒有提供獨立于數據庫驅動的Blob和Clob建立對象。因此需要自己編寫與驅動有關的代碼,但這樣又牽掣到移植性。怎樣才是解決辦法呢?這就要用到前面說過的思想了使用數據塊進行寫操作。同樣用PreparedStatement和CallableStatememt類,但參數的設置可以換為setAsciiStream、setBinaryStream、setCharacterStream、setObject(當然前3個同樣存在長度的問題)
下面給大家個例子以方便大家理解
 public void insertFile(File f)  throws Exception{
  FileInputStream fis=new FileInputStream(f,Connection conn);
  byte[] buffer=new byte[1024];
  data=null;
  int sept=0;int len=0;
  
  while((sept=fis.read(buffer))!=-1){
   if(data==null){
    len=sept;
    data=buffer;
   }else{
    byte[] temp;
    int tempLength;
    
    tempLength=len+sept;
    temp=new byte[tempLength];
    System.arraycopy(data,0,temp,0,len);
    System.arraycopy(buffer,0,temp,len,sept);
    data=temp;
    len=tempLength;
   }
   if(len!=data.length()){
    byte temp=new byte[len];
    System.arraycopy(data,0,temp,0,len);
    data=temp;
   }
  }
  String sql="insert into fileData (filename,blobData) value(?,?)";
  PreparedStatement ps=conn.prepareStatement(sql);
  ps.setString(1,f.getName());
  ps.setObject(2,data);
  ps.executeUpdate();


 }

最后由于剛剛說過Clob類型讀取字符的長度問題,這里再給大家一段代碼,希望對你有幫助
 public static String getClobString(ResultSet rs, int col) {
   try {
    Clob c=resultSet.getClob(2);
    Reader reader=c.getCharacterStream():
    if (reader == null) {
  return null;
    }
    StringBuffer sb = new StringBuffer();
    char[] charbuf = new char[4096];
    for (int i = reader.read(charbuf); i > 0; i = reader.read(charbuf)) {
  sb.append(charbuf, 0, i);
    }
    return sb.toString();
   } catch (Exception e) {
    return "";
   }
  }

另外似乎前面還提到過LIKE檢索的問題。LONGVARCHAR類型中不可以用LIKE查找(至少ORA中不可以使用,其他的數據庫我沒有試過),在ORA中我們可以使用這樣一個函數dbms_lob.instr來代替LIKE來個例子吧

select docid,dat0 from text where dbms_lob.instr(dat0,'魏',1,1)>0

在text表中有兩個字段docid用來放文檔編號dat0為clob類型存放文章內容;這句話的意思就是檢索第一條dat0中出現第一次"魏"字的數據。聽起來這個檢索的數據有點象Google的“手氣不錯”

以上只是對數據庫中比較特殊的兩個類型做了簡單的說明,希望能對你有所幫助;另外筆者也只是對ORA數據庫有一點點的了解,其他的數據庫不是很清楚,如果有什么不對的地方也請各位指出,可以通過郵件聯系我zuyingwei@hotmail.com或merlin_wei@hotmail.com


 

(出處:http://www.49028c.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品久久久久久久久久| 久久久久久久香蕉网| www.亚洲免费视频| 欧美激情第1页| 欧美日韩一区二区免费视频| 国产成人啪精品视频免费网| 成人免费午夜电影| 国产91免费观看| 日本中文字幕不卡免费| 不卡伊人av在线播放| 精品久久久久国产| 亚洲激情第一页| 在线精品国产成人综合| 综合欧美国产视频二区| 国产成人精品久久久| 成人激情在线观看| 日本精品视频在线观看| 狠狠色狠狠色综合日日五| 久久人人爽人人爽人人片亚洲| 欧美成人精品影院| 国产91精品久久久| 不卡av电影在线观看| 成人h视频在线观看播放| 久久成人在线视频| 日本午夜精品理论片a级appf发布| 久久伊人免费视频| 91免费的视频在线播放| 中文字幕精品—区二区| 91成人福利在线| 在线激情影院一区| 秋霞av国产精品一区| 色诱女教师一区二区三区| 久久福利视频网| 91国偷自产一区二区三区的观看方式| 亚洲人成绝费网站色www| 精品在线观看国产| 国产精品偷伦视频免费观看国产| 亚洲性日韩精品一区二区| 日韩成人激情影院| 国产精品一区二区av影院萌芽| 国内免费精品永久在线视频| 国产精品日本精品| 这里只有精品在线观看| 中文字幕亚洲激情| 欧美专区在线观看| 懂色av一区二区三区| 亚洲人成免费电影| 欧美中文字幕视频在线观看| 色伦专区97中文字幕| 国产主播在线一区| 26uuu亚洲伊人春色| 亚洲小视频在线| 日本午夜人人精品| 亚洲石原莉奈一区二区在线观看| 人人澡人人澡人人看欧美| 欧美中文在线观看| 成人精品网站在线观看| 亚洲精品xxx| 精品一区二区电影| 一色桃子一区二区| 日本不卡视频在线播放| 欧美一级片免费在线| 欧美一区二区三区图| 亚洲欧美一区二区三区情侣bbw| 久久久久久久久亚洲| 亚洲精品综合精品自拍| 91在线免费视频| 久久精品视频99| 国产欧美日韩专区发布| 亚洲一区二区福利| 久久精品国产亚洲7777| 91免费电影网站| 成人在线国产精品| 亚洲一区二区三区777| 亚洲v日韩v综合v精品v| 国产精品综合不卡av| 在线亚洲欧美视频| 国产精品色悠悠| 精品久久久久久久久久久| 国产欧美日韩精品在线观看| 在线电影欧美日韩一区二区私密| 亚洲国产精品成人精品| 成人免费自拍视频| 亚洲福利在线播放| 亚洲在线免费视频| 26uuu久久噜噜噜噜| 91亚洲人电影| 欧洲美女免费图片一区| 亚洲人成电影在线播放| 日韩美女在线观看一区| 精品激情国产视频| 国产精品久久久久久久久久久久久| 精品国产一区二区三区久久久| 国产成人精品一区| 亚洲精品99999| 欧美怡春院一区二区三区| 亚洲欧美日本精品| 欧美激情久久久久| 亚洲午夜性刺激影院| 亚洲国产精品va在线看黑人| 国产精品久久久av久久久| 欧美日韩国产二区| 亚洲欧美日韩图片| 日本sm极度另类视频| www.国产一区| 亚洲女人天堂网| 久久男人的天堂| 亚洲欧美国产日韩天堂区| 日韩国产高清污视频在线观看| 九色精品免费永久在线| 亚洲欧美国产va在线影院| 国产精品久久久久久av福利软件| 在线看日韩av| 奇米四色中文综合久久| 国产精品成人一区| 91免费高清视频| 亚洲成人中文字幕| 久久九九国产精品怡红院| 中文字幕欧美亚洲| 最新中文字幕亚洲| 精品中文字幕在线| 亚洲欧美另类中文字幕| 久久亚洲一区二区三区四区五区高| 成人黄色av网站| 日韩av免费网站| 国外成人在线播放| 午夜精品久久17c| 亚洲伊人久久综合| 亚洲大胆人体视频| 久久久久国产精品www| 国产偷国产偷亚洲清高网站| 少妇av一区二区三区| 精品高清一区二区三区| 一色桃子一区二区| 久久久久久噜噜噜久久久精品| 久久精品国产欧美亚洲人人爽| 亚洲高清久久久久久| 亚洲视频综合网| 国产成人精品电影| 国外日韩电影在线观看| 久久精品2019中文字幕| 97在线视频一区| 亚洲国产精品一区二区三区| 亚洲精品视频免费在线观看| 欧美精品国产精品日韩精品| 国产精品第七十二页| 欧美成人亚洲成人| 国产精品高精视频免费| 久久久精品视频成人| 亚洲精品国产精品国自产在线| 69久久夜色精品国产7777| 91在线观看免费高清完整版在线观看| 97国产精品视频人人做人人爱| 久久综合88中文色鬼| 欧美激情在线一区| 欧美乱大交xxxxx| 欧美另类高清videos| 欧美又大粗又爽又黄大片视频| 亚洲日韩中文字幕在线播放| 国产精品日韩在线一区| 日韩国产精品亚洲а∨天堂免| 日韩第一页在线| 日韩精品极品在线观看| 亚洲三级 欧美三级|