oracle blob mybatis xml讀寫

来源:http://www.cnblogs.com/helloruijie/archive/2016/04/12/5384141.html
-Advertisement-
Play Games

最近項目用到了對oracle大欄位的讀寫,小白在這裡記錄下,方便自己以後用到,也希望對其他朋友有一點幫助。 由於項目的原因,這裡的blob只是對xml報文的讀寫,並沒有涉及到保存圖片等,因此下麵涉及的方法可能不全面,如有需要請自行查看其它大神博客。 一、讀blob 這裡對blob的讀是直接在資料庫建 ...


最近項目用到了對oracle大欄位的讀寫,小白在這裡記錄下,方便自己以後用到,也希望對其他朋友有一點幫助。

由於項目的原因,這裡的blob只是對xml報文的讀寫,並沒有涉及到保存圖片等,因此下麵涉及的方法可能不全面,如有需要請自行查看其它大神博客。

一、讀blob

這裡對blob的讀是直接在資料庫建了一個函數Blob_To_Varchar ,這樣方便項目裡面其它地方用到查詢blob:

CREATE OR REPLACE Function Blob_To_Varchar (Blob_In In Blob) Return Varchar2
Is
    V_Varchar Varchar2(4000);
    V_Start Pls_Integer := 1;
    V_Buffer Pls_Integer := 4000;
Begin
    If Dbms_Lob.Getlength(Blob_In) Is Null Then
        Return '';
    End If;
    For I In 1..Ceil(Dbms_Lob.Getlength(Blob_In) / V_Buffer) Loop
        --當轉換出來的字元串亂碼時,可嘗試用註釋掉的函數
        --V_Varchar := Utl_Raw.Cast_To_Varchar2(Utl_Raw.Convert(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start),'SIMPLIFIED CHINESE_CHINA.ZHS16GBK', 'AMERICAN_THE NETHERLANDS.UTF8'));
        V_Varchar := Utl_Raw.Cast_To_Varchar2(Dbms_Lob.Substr(Blob_In, V_Buffer, V_Start));
        V_Start := V_Start + V_Buffer;
    End Loop;
    Return V_Varchar;
End Blob_To_Varchar;

直接在sql裡面用創建的Blob_To_Varchar函數。

SELECT  Blob_To_Varchar(req_tpl) as req_tpl FROM inf_xml;

二、寫blob

oracle存大數據的時候,要先插入一個empty_blob()占位符,占到blob欄位,其次在查詢出來這個大欄位用流的方式寫入。

首先是插入一個empty_blob()占位符

//插入數據
int
insertLogInf = this.logControllerDao.insertLogInfo(params); if(insertLogInf > 0){
       //插入大欄位數據
for(int i=0;i<2;i++){ if(i == 0){ insertBlob(i,log_id,Const.getStrValue(params, "req_xml")); }else{ insertBlob(i,log_id,rsp_xml); } } }
insertBlob方法(由於要插入2個blob,又不能同時寫進去,所以用比較笨的方法迴圈下)
    public void insertBlob(int i , String log_id ,String insertXml)throws Exception{
        BLOB blobXML = null;
     //查詢數據 LogInterfaceXML retLogInf
= this.logControllerDao.queryBlobLogInfByLogid(log_id); if(i == 0){ blobXML = (BLOB) retLogInf.getReq_xml(); }else{ blobXML = (BLOB) retLogInf.getRsp_xml(); } OutputStream ops = null; try { byte[] data = null; ops = blobXML.setBinaryStream(0); data = insertXml.getBytes(); ops.write(data); } catch (Exception e) { e.printStackTrace(); } finally { try { if(ops!=null){ ops.close(); } } catch (IOException e) { e.printStackTrace(); } } }

這裡的req_xml rsp_xml 要用 Object

@Alias("logInterfaceXML")
public class LogInterfaceXML {
    
    private String log_id;
    private String op_code ; 
    private String req_time ; 
    private String rsp_time ; 
    private String ep_address ;
    private String result_desc ; 
    private Object req_xml ; 
    private Object rsp_xml ;
    
    public String getOp_code() {
        return op_code;
    }
    public void setOp_code(String op_code) {
        this.op_code = op_code;
    }
    public String getReq_time() {
        return req_time;
    }
    public void setReq_time(String req_time) {
        this.req_time = req_time;
    }
    public String getRsp_time() {
        return rsp_time;
    }
    public void setRsp_time(String rsp_time) {
        this.rsp_time = rsp_time;
    }
    public String getEp_address() {
        return ep_address;
    }
    public void setEp_address(String ep_address) {
        this.ep_address = ep_address;
    }
    public String getResult_desc() {
        return result_desc;
    }
    public void setResult_desc(String result_desc) {
        this.result_desc = result_desc;
    }
    public Object getReq_xml() {
        return req_xml;
    }
    public void setReq_xml(Object req_xml) {
        this.req_xml = req_xml;
    }
    public Object getRsp_xml() {
        return rsp_xml;
    }
    public void setRsp_xml(Object rsp_xml) {
        this.rsp_xml = rsp_xml;
    }
    public String getLog_id() {
        return log_id;
    }
    public void setLog_id(String log_id) {
        this.log_id = log_id;
    }
    
}

  

對資料庫的操作用的是mybatis

    <resultMap id="logInterfaceResultMap" type="logInterfaceXML">     
        <result property="log_id" column="id"/>     
        <result property="op_code" column="op_code"/>  
        <result property="req_time" column="req_time" />  
        <result property="rsp_time" column="rsp_time" />  
        <result property="ep_address" column="ep_address" />  
        <result property="req_xml" column="req_xml" jdbcType="BLOB" />  
        <result property="rsp_xml" column="rsp_xml" jdbcType="BLOB" />  
        <result property="result_desc" column="result_desc" />  
    </resultMap> 
    
    <select id="queryBlobLogInfByLogid" resultType="logInterfaceXML" parameterType="string" databaseId="oracle">
        select * from inf_xml c where c.log_id = #{log_id} for update
    </select>

    <insert id="insertLogInfo" parameterType="map" databaseId="oracle">
        insert into inf_xml (log_id,op_code,req_time,rsp_time,ep_address,req_xml,rsp_xml,state,result_desc)
            values (#{log_id},#{op_code},to_date(#{req_time},'YYYY-MM-DD HH24:MI:SS'),to_date(#{rsp_time},'YYYY-MM-DD HH24:MI:SS'),#{ep_address},empty_blob(),empty_blob(),'1',#{result_desc})
    </insert>

 

可能是由於網路問題,這裡寫入blob的xml數據,時不時的會出現延時問題。

如果馬上查詢數據的話,可能不一定有數據,要等會才有數據。

具體是什麼原因導致的,還在研究中,有哪位大神要是知道,可以告訴小弟一聲,謝謝了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天在使用bootbox做彈出提示遇到些麻煩,由於使用kendoWindow先彈出數據輸入視窗, 然後在檢核輸入時,又用bootbox做為提示視窗,這下悲劇了,後彈出的bootbox視窗總是在kendoWindow後面, 查了兩者的API文檔,均沒有設置的地方,木有辦法,只能自己搞了,使用調試工具查 ...
  • × 目錄 [1]定義 [2]漸變線 [3]色標 [4]重覆漸變 [5]多背景 [6]應用場景 [7]IE相容 前面的話 在CSS3出現之前,漸變效果只能通過圖形軟體設計圖片來實現,可拓展性差,還影響性能。如今已經進入CSS3標準的漸變可以很輕鬆的完成漸變效果。漸變實際上分為線性漸變和徑向漸變兩種,本 ...
  • 在CSS3中是提倡使用選擇器來將樣式與元素直接綁定在一起的。 網頁開發過程中,我們需要定義很多class來應用到不同的元素上,由於class本身是沒有語義而且是可以復用的,所以過度使用class會使得整個樣式表結構非常混亂。為了減少class的使用頻度,需要儘可能的使用選擇器來指定元素。而且使用選擇 ...
  • JavaScript語言有多種方式,創建互動式網站,Web應用程式。基本的JavaScript框架是預先寫好的JavaScript代碼集。這些JavaScript框架也被稱為JavaScript庫,開發這種編程語言在很多方面的應用。它是通過使用JavaScript代碼同這些JavaScript框架寫 ...
  • 技巧1: 我們可以發現id只能在內部使用,不會污染全局,這是傳統的閉包寫法。我們修改一下寫法 修改後的寫法使得外部能夠使用內部定義的id,而內部的id不會污染外部環境。 技巧2: 當字元串不會因為大小寫受影響時,推薦統一轉換為小寫或者大寫後進行使用。這樣就不會受到大小寫的影響。例如: 這樣不管元素名 ...
  • 第一次做移動端的頁面,遇到的第一個問題就是移動端的輪播圖。其實輪播圖的插件有很多,但是完全滿足需求的並不容易找。 需求: 1.實現基本的觸屏輪播圖效果 2.傳入非標準比例的圖片,可以自動平鋪(有時候圖片可能比例略有偏差,當然例子里的圖是隨便找的,平鋪之後不能看呀) 3.輪播圖模塊能實現自適應,按照固 ...
  • 實例:ORACLE到ORACLE的數據傳遞 編寫job.xml文件,添加變數參數 執行datax.py文件時記得帶參數 格式:./datax.py –p"-Ddbname=*** -Dip=***" job.xml 實現指定的列名數據傳遞 修改reader裡面的colums和writer裡面的col... ...
  • 這篇隨筆用來記錄資料庫的學習,隨時更新補充,主要寫一些比較少關註的內容 PERSISTED: 說明物理存儲計算列的值(書本上的解釋,什麼鬼意思...) 現實操作中,CHECK、FOREIGN KEY 和 NOT NULL 約束要求計算列是持久化(PERSISTED)的。 大概它的作用就是這個吧? A ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...