当前位置:首页 > 数据库 > Oracle

oracle blob mybatis xml读写

最近项目用到了对oracle大字段的读写,小白在这里记录下,方便自己以后用到,也希望对其他朋友有一点帮助。

由于项目的原因,这里的blob只是对xml报文的读写,并没有涉及到保存图片等,因此下面涉及的方法可能不全面,如有需要请自行查看其它大神博客。

一、读blob

这里对blob的读是直接在数据库建了一个函数Blob_To_Varchar ,这样方便项目里面其它地方用到查询blob:

            CREATE
            OR
            REPLACE
            Function Blob_To_Varchar (Blob_In In Blob) ReturnVarchar2Is
    V_Varchar Varchar2(4000);
    V_Start Pls_Integer :=1;
    V_Buffer Pls_Integer :=4000;
BeginIf Dbms_Lob.Getlength(Blob_In) IsNullThenReturn‘‘;
    EndIf;
    For I In1..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")
publicclass 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 ; 
    privateObject req_xml ; 
    privateObject rsp_xml ;
    
    public String getOp_code() {
        return op_code;
    }
    publicvoid setOp_code(String op_code) {
        this.op_code = op_code;
    }
    public String getReq_time() {
        return req_time;
    }
    publicvoid setReq_time(String req_time) {
        this.req_time = req_time;
    }
    public String getRsp_time() {
        return rsp_time;
    }
    publicvoid setRsp_time(String rsp_time) {
        this.rsp_time = rsp_time;
    }
    public String getEp_address() {
        return ep_address;
    }
    publicvoid setEp_address(String ep_address) {
        this.ep_address = ep_address;
    }
    public String getResult_desc() {
        return result_desc;
    }
    publicvoid setResult_desc(String result_desc) {
        this.result_desc = result_desc;
    }
    public Object getReq_xml() {
        return req_xml;
    }
    publicvoid setReq_xml(Object req_xml) {
        this.req_xml = req_xml;
    }
    public Object getRsp_xml() {
        return rsp_xml;
    }
    publicvoid setRsp_xml(Object rsp_xml) {
        this.rsp_xml = rsp_xml;
    }
    public String getLog_id() {
        return log_id;
    }
    publicvoid 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数据,时不时的会出现延时问题。

如果马上查询数据的话,可能不一定有数据,要等会才有数据。

具体是什么原因导致的,还在研究中,有哪位大神要是知道,可以告诉小弟一声,谢谢了。

原文:http://www.cnblogs.com/helloruijie/p/5384141.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐