欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java通過Mybatis操作Oracle的Clob和Blob的解決方式

 更新時間:2025年05月17日 09:50:19   作者:烤肉不拌飯  
這篇文章主要介紹了Java通過Mybatis操作Oracle的Clob和Blob的解決方式及注意事項,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

前段時間到客戶現(xiàn)場出差,在現(xiàn)場遇到了base64和圖片互相轉(zhuǎn)換的問題,在現(xiàn)場肯定不如自己安安靜靜寫代碼的時候冷靜,為了解決問題幾乎浪費了一整天,所以這篇文章也是為了梳理一下Java通過Mybatis操作Oracle的Clob和Blob的解決方式和注意事項

首先我們要搞清楚CLOB和BLOB的區(qū)別,這兩個被統(tǒng)稱為LOB,即Large Object(大對象類型),最本質(zhì)的區(qū)別

  • CLOB的C,可以理解為Char(當(dāng)然這種理解方式肯定不對),所以CLOB保存的是字符大對象
  • BLOB的B,即Binary,保存的是二進制大對象

這時候我們就能大概理解了,如果我們要在Java中用數(shù)據(jù)類型去接,則

  • CLOB應(yīng)該轉(zhuǎn)換成String
  • BLOB應(yīng)該轉(zhuǎn)換成byte[]

那我們就可以大概模擬一下如何獲得這些值,模擬一下當(dāng)時我在現(xiàn)場遇到的情況

首先,我們實際操作的,都是一張圖片,這張圖片在BLOB中保存,可以直接保存,即在plsql中,也能通過查看詳情的方式查看圖片

在CLOB中保存,應(yīng)該是一個base64的字符串

 單純考慮獲取,我們可以簡單集成Mybatis,用Map<String, Object>直接接住獲取的數(shù)據(jù),如圖所示

@RequestMapping("getArr/{id}")
public String getArr(@PathVariable String id) throws SQLException {
  Map<String, Object> map = byteArrayTestService.find(id);
  System.err.println("------------------");
  System.err.println("map:"+map);
  return "success";
}

 我們先看看,如果只通過這種方式獲取,獲取出來的數(shù)據(jù)是什么樣子的

可以看到,獲取到的數(shù)據(jù)沒有以[B開頭,說明這并不是byte數(shù)組,而是包裝過的,那很簡單,我們使用相應(yīng)的格式再接一下就可以了

Blob blob = (Blob)map.get("BLOB");
Clob clob = (Clob)map.get("CLOB");

這個時候可能會有同學(xué)發(fā)現(xiàn),Blob和Clob這兩個類分別對應(yīng)了兩個包的內(nèi)容

莫擔(dān)心,oracle.sql.Blob實現(xiàn)了java.sql.Blob,里面的方法名和參數(shù)都是一樣,Clob也是一樣,單純使用的話感覺不到什么區(qū)別

按照之前所說,BLOB應(yīng)該用byte[]來接,CLOB應(yīng)該用String來接,這時候就遇到了我查資料時出現(xiàn)的各種問題

在很多人的博客中,不管是BLOB轉(zhuǎn)byte[],還是CLOB轉(zhuǎn)String,都是通過流的方式去進行的,這里也給大家提供一下別人的代碼,親測用是可以用的

/**
* BLOB轉(zhuǎn)byte[]
* @param blob
* @return
*/
private byte[] blobToBytes(Blob blob) {
    BufferedInputStream is = null;
    try {
        is = new BufferedInputStream(blob.getBinaryStream());
        byte[] bytes = new byte[(int) blob.length()];
        int len = bytes.length;
        int offset = 0;
        int read = 0;
        while (offset < len && (read = is.read(bytes, offset, len - offset)) >= 0) {
            offset += read;
        }
        return bytes;
    } catch (Exception e) {
        return null;
    } finally {
        try {
            is.close();
            is = null;
        } catch (IOException e) {
            return null;
        }
    }
}
/**
* CLOB轉(zhuǎn)String
* @param clob
* @return
*/
public static String clobToString(Clob clob) {
    try {
        Reader inStreamDoc = clob.getCharacterStream();
        char[] tempDoc = new char[(int) clob.length()];
        inStreamDoc.read(tempDoc);
        inStreamDoc.close();
        return new String(tempDoc);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SQLException es) {
        es.printStackTrace();
    }
    return null;
}

這個時候就很令人費解,為什么都約定了BLOB和CLOB是什么樣的數(shù)據(jù),但還要使用流的方式來接呢,這時候,就要看看Blob這個類本身有沒有提供什么方法,只要點進源碼,赫然可以看到

這就尷尬了,難道是這種自帶的方法有問題?帶著疑問,讓我們來看看到底能不能用

注意上邊的兩個方法注釋中都寫明了,第一個參數(shù)pos的值,應(yīng)該從1開始

首先是BLOB的轉(zhuǎn)換,因為是圖片,我們統(tǒng)一轉(zhuǎn)換成base64字符串再對比一下

@RequestMapping("getArr/{id}")
public String getArr(@PathVariable String id) throws SQLException {
    Map<String, Object> map = byteArrayTestService.find(id);
    System.err.println("------------------");
    Blob blob = (Blob)map.get("BLOB");
    //Clob clob = (Clob)map.get("CLOB");
    //自帶的方法
    byte[] bytes1 = blob.getBytes(1, (int) blob.length());
	//流轉(zhuǎn)byte[]
    byte[] bytes2 = blobToBytes((Blob)map.get("BLOB"));
    System.err.println("result===="+ DatatypeConverter.printBase64Binary(bytes2).equals(DatatypeConverter.printBase64Binary(bytes1)));
    return "success";
}

充分證明了流轉(zhuǎn)byte[]和自帶的getBytes方法沒有任何區(qū)別

那CLOB也是如此嗎

CLOB直接保存的就是base64字符串,直接對比就好

@RequestMapping("getArr/{id}")
public String getArr(@PathVariable String id) throws SQLException {
    Map<String, Object> map = byteArrayTestService.find(id);
    System.err.println("------------------");
    //Blob blob = (Blob)map.get("BLOB");
    Clob clob = (Clob)map.get("CLOB");
    //自帶的方法
    String clobStr1 = clob.getSubString(1, (int) clob.length());
	//流轉(zhuǎn)String
    String clobStr2 = clobToString(clob);
    System.err.println("result===="+ clobStr2.equals(clobStr1));
    return "success";
}

 CLOB的轉(zhuǎn)換也是沒問題的

所以最終確定,操作BLOB和CLOB,直接使用類自帶的方法就可以了

到此這篇關(guān)于Java通過Mybatis操作Oracle的Clob和Blob的文章就介紹到這了,更多相關(guān)mybatis oracle Clob和Blob內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Cloud Feign請求添加headers的實現(xiàn)方式

    Spring Cloud Feign請求添加headers的實現(xiàn)方式

    這篇文章主要介紹了Spring Cloud Feign請求添加headers的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • SpringBoot集成P6spy實現(xiàn)自定義SQL日志打印

    SpringBoot集成P6spy實現(xiàn)自定義SQL日志打印

    本文主要介紹了SpringBoot集成P6spy實現(xiàn)自定義SQL日志打印,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java 關(guān)于String字符串原理上的問題

    Java 關(guān)于String字符串原理上的問題

    字符串廣泛應(yīng)用 在 Java 編程中,在 Java 中字符串屬于對象,Java 提供了 String 類來創(chuàng)建和操作字符串,讓我們一起來了解它
    2022-04-04
  • 詳解Spring MVC3返回JSON數(shù)據(jù)中文亂碼問題解決

    詳解Spring MVC3返回JSON數(shù)據(jù)中文亂碼問題解決

    本篇文章主要介紹了Spring MVC3返回JSON數(shù)據(jù)中文亂碼問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • SpringCloud Feign 服務(wù)調(diào)用的實現(xiàn)

    SpringCloud Feign 服務(wù)調(diào)用的實現(xiàn)

    Feign是一個聲明性web服務(wù)客戶端。本文記錄多個服務(wù)之間使用Feign調(diào)用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Spring中的@AutoWired與@Resource及@Qualifier注解詳解

    Spring中的@AutoWired與@Resource及@Qualifier注解詳解

    這篇文章主要介紹了Spring中的@AutoWired與@Resource及@Qualifier注解詳解,spring不但支持自己定義的@Autowired注解,所以Autowired與Spring是強相關(guān)性,只能在spring框架中使用,而后幾個注解則不然,需要的朋友可以參考下
    2023-11-11
  • Spring Bean的初始化和銷毀實例詳解

    Spring Bean的初始化和銷毀實例詳解

    這篇文章主要介紹了Spring Bean的初始化和銷毀,結(jié)合實例形式詳細(xì)分析了Spring Bean的初始化和銷毀相關(guān)配置、使用方法及操作注意事項,需要的朋友可以參考下
    2019-11-11
  • Java詳細(xì)解析下拉菜單和彈出菜單的使用

    Java詳細(xì)解析下拉菜單和彈出菜單的使用

    這篇文章主要介紹了怎么用Java來創(chuàng)建和使用下拉菜單和彈出菜單,下拉菜單和彈出菜單是我們經(jīng)常要用的工具,但是你有想過自己怎么去實現(xiàn)它嗎,感興趣的朋友跟隨文章往下看看吧
    2022-04-04
  • java并發(fā)編程之進程和線程調(diào)度基礎(chǔ)詳解

    java并發(fā)編程之進程和線程調(diào)度基礎(chǔ)詳解

    這篇文章主要介紹了java并發(fā)編程之進程和線程調(diào)度基礎(chǔ),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Spring?Boot日志SLF4J和Logback示例詳解

    Spring?Boot日志SLF4J和Logback示例詳解

    這篇文章主要介紹了Spring?Boot日志SLF4J和Logback詳解,Logback相比于Log4j,性能提高了10倍以上的性能,占用的內(nèi)存也變小了,并且文檔十分詳細(xì),推薦使用Slf4j+Logback,需要的朋友可以參考下
    2023-07-07

最新評論