hibernate操作oracle的blob字段 -程序员宅基地

技术标签: Hibernate  Weblogic  JDBC  JAVA、WEB开发  Oracle  SQL  

1. Bolb类型字段说明:
写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?
这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正的写入blob数据了。
2. 获取游标存在的问题:
因为我使用的是weblogic配置的数据源,weblogic做了一些封装,返回来的blob的是weblogic.jdbc.wrapper.Blob对象,不能直接转化为oracle的JDBC的oracleBlob,否则产生转型异常Cast Exception:

代码示例:
//PO:CardSuitInfo
public class CardSuitInfo implements Serializable ...{
private java.sql.Blob cardFacePicFile;
public void setCardFacePicFile(Blob cardFacePicFile) ...{
this.cardFacePicFile = cardFacePicFile;
}
public java.sql.Blob getCardFacePicFile() ...{
return this.cardFacePicFile;
}
}
//1.首先插入空的blob
cardSuitInfo.setCardFacePicFile(net.sf.hibernate.Hibernate.createBlob(new byte[1]));
session.save(cardSuitInfo);
session.flush();
//2.写入blob
session.refresh(cardSuitInfo, LockMode.UPGRADE);// 设置锁定级别
weblogic.jdbc.wrapper.Blob weblogicBlob = (weblogic.jdbc.wrapper.Blob) cardSuitInfo.getCardFacePicFile();
oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) weblogicBlob.getVendorObj();
OutputStream out = oracleBlob.getBinaryOutputStream();
byte[] buffer = cardSuitInfoView.getCardFacePicFileBody();
out.write(buffer, 0, buffer.length);
out.close();
session.save(cardSuitInfo);


读取blob字段:
......
......
weblogic.jdbc.wrapper.Blob weblogicBlob = (weblogic.jdbc.wrapper.Blob) cardSuitInfo.getCardBackPicFile();
oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) weblogicBlob.getVendorObj();
BufferedInputStream in = new BufferedInputStream(oracleBlob.getBinaryStream());
long picLong = cardSuitInfo.getCardBackPicFile().length();
byte[] bytes = new byte[Integer.parseInt(picLong + \"\")];//
int result = in.read(bytes);
if (result > 0) ...{
downloadFileView.setFileByteArray(bytes);
}
in.close();
......
......

3.总结:
weblogic进行的封装,使我们必须加这步转换,如果用jdbc操作就不会出现此问题,而直接可以转化为oracle.sql.BLOB的对象。
重点步骤:
weblogic.jdbc.wrapper.Blob weblogicBlob = (weblogic.jdbc.wrapper.Blob) cardSuitInfo.getCardBackPicFile();
oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) weblogicBlob.getVendorObj();

原文地址:http://www.svn8.com/sql/Oracle/2009112813879.html
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wallimn/article/details/83644218

智能推荐

零基础学python 视频_全网最全Python视频教程真正零基础学习Python视频教程 490集...-程序员宅基地

文章浏览阅读197次。Python Web开发—进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程【课程简介】这是一门Python Web开发进阶课程,手把手教你用Python开发完整的商业级web项目所需的各种技能。【课程目标】在这套视频中,你将系统的学到Mysql数据库,Django基础及进阶、项目实战、缓存优化和项目部署等全套Django开发技能,以及Ajax,Flask,Tornad..._49049401【pyqnuonuokzhuoyi】

Java面试题---基础篇_integer i1 = 100; integer i2 = 100; integer i3 = 2-程序员宅基地

文章浏览阅读1.2k次。1、什么是装箱?什么是拆箱?装箱基本类型转变为包装器类型的过程。拆箱包装器类型转变为基本类型的过程。//JDK1.5之前是不支持自动装箱和自动拆箱的,定义Integer对象,必须Integeri=newInteger(8);//JDK1.5开始,提供了自动装箱的功能,定义Integer对象可以这样Integeri=8;//自动拆箱2、装箱和拆箱的执行过程?装箱是通过调用包装器类的valueOf方法实现的3、常见问题?Java反射,就是在运行状态中序列化JVM。......_integer i1 = 100; integer i2 = 100; integer i3 = 200; integer i4

el-table 表头和文字都居中方法_el-table表头居中-程序员宅基地

文章浏览阅读7.3k次,点赞4次,收藏6次。在日常开发中,需要写个表格,并且想要美观一点,如果想要el-table 表头和文字可以居中显示?直接上方法:在el-table标签中加入: header-cell-style=“{ ‘text-align’: ‘center’ }”: cell-style=“{ ‘text-align’: ‘center’ }”<el-table : data="tableData" stripe border highlight-current-row : header-cell-st_el-table表头居中

thinkphp5自定义正则验证_tp5 regex-程序员宅基地

文章浏览阅读3.3k次。if ($this-&gt;request-&gt;isPost()) { $validate = new Validate([ 'bar_name' =&gt; 'require', 'bar_phone' =&gt; 'require|regex:1[3-8]{1}[0-9]{9}', 'business_hours' =&gt; 're..._tp5 regex

1.sapui5之在Axure软件中使用Fiori模板操作示例_fiori的ui设计原型-程序员宅基地

文章浏览阅读703次。@TOC1.sapui5之在Axure软件中使用Fiori模板操作示例1 基本了解与操作1.1控件通过下面网站进行fiori模板的下载以及根据步骤加入到axure中进行使用https://experience.sap.com/fiori-design-web/design-stencils-for-axure-rp/另:axure中的占位符:对于逻辑细节未考虑清楚的地方暂时用此符号进行标记。如下如1.2 交互(1)利用交互去进行页面的跳转步骤: a. 针对于需要交互的组件点击新建交_fiori的ui设计原型

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

随便推点

Python批量改变图片名字_python批量修改图片名称-程序员宅基地

文章浏览阅读1.7w次,点赞91次,收藏320次。import os.pathdef rename(img_folder,num): for img_name in os.listdir(img_folder): # os.listdir(): 列出路径下所有的文件 #os.path.join() 拼接文件路径 src = os.path.join(img_folder, img_name) #src:要修改的目录名 dst = os.path.join(img_folder, 'Cat'+_python批量修改图片名称

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点