Oracle读取Blob数据-通过hibernate

摘要:
//定义Blob的pthto-privateBlobphoto<DOCTYPEhibernate mappingPUBLIC“-//HHibernate/Hibernate MappingDTD3.0//EN”“http;property name=”email“type=”java.lang.String“>

通过hibernate向Oracle存储字节类型的数据(如byte[]等),在定义实体对象的时候不能用"private byte[] content", 这样定义我试过,在存储数据的时候(session.save(user))是没有问题的,但是在读取Blob字段(Oracle中存储byte[]使用的是"BLOB"类型)时就会出现问题,读出来的东西就成了乱码.

使用hibernate读取Blob字段时,实体对象(对应的byte[]类型字段)应该这样定义:

  1. import java.io.Serializable; 
  2. import java.sql.Blob; 
  3.  
  4. public class User implements Serializable {                 
  5.     // Fields                    
  6.     private long id;            
  7.     private String name;            
  8.     private String email;            
  9.     private String addr;            
  10.     // 定义Blob的pthto             
  11.     private Blob photo; 
  12.      
  13.     // getter and setters  
  14.     ...... 

对应的hibernate文件配置:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  4. <Hibernate-mapping>          
  5.     <class name="com.xxx.xxx.User" table="user">              
  6.         <id name="id" type="java.lang.Long">                  
  7.             <column name="id" />                  
  8.             <generator class="increment" />              
  9.         </id>              
  10.         <property name="name" type="java.lang.String">                  
  11.             <column name="name" length="45" not-null="true" />              
  12.         </property>              
  13.         <property name="email" type="java.lang.String">                  
  14.             <column name="email" length="45" />              
  15.         </property>              
  16.         <property name="addr" type="java.lang.String">                  
  17.             <column name="addr" length="45" />              
  18.         </property>              
  19.         <!-- 映射blob类型 -->              
  20.         <property name="photo" type="java.sql.Blob">                  
  21.             <column name="photo" />              
  22.         </property>          
  23.     </class>      
  24. </Hibernate-mapping>   

读取Blob数据方法:

  1. // 写方法  
  2. public void testCreate(){                       
  3.     User user = new User();           
  4.     user.setName("linweiyang");           
  5.     user.setAddr("beijing");           
  6.     user.setEmail("linweiyang@163.com");           
  7.     Blob photo = null;                   
  8.     try {               
  9.         //将图片读进输入流                
  10.         FileInputStream fis = new FileInputStream("c:\a.jpg");               
  11.         //转成Blob类型                
  12.         photo = Hibernate.createBlob(fis);                           
  13.     } catch (FileNotFoundException e) {               
  14.         e.printStackTrace();           
  15.     } catch (IOException e) {               
  16.         e.printStackTrace();           
  17.     }                           
  18.     user.setPhoto(photo);                      
  19.     Session session = factory.openSession();           
  20.     Transaction tr = session.beginTransaction();           
  21.     session.save(user);           
  22.     tr.commit();           
  23.     session.close();          
  24. }               
  25.  
  26. // 读方法  
  27. public void testRerieve(){                       
  28.     Session session = factory.openSession();           
  29.     User user = (User)session.load(User.class, new Long(3));           
  30.     try {               
  31.         //从数据库中要读取出来                
  32.         InputStream is = user.getPhoto().getBinaryStream();               
  33.         //在把写到一个图片格式的文件里                
  34.         FileOutputStream fos = new FileOutputStream("c:\linweihan.jpg");                           
  35.         byte[] buffer = new byte[1024];               
  36.         int len = 0;               
  37.         //从数据库中读取到指定的字节数组中                
  38.         while((len = is.read(buffer) )!= -1){                   
  39.             //从指定的数组中读取,然后输出来,所以这里buffer好象是连接inputStream和outputStream的一个东西                    
  40.             fos.write(buffer,0,len);               
  41.         }           
  42.     } catch (FileNotFoundException e) {               
  43.         e.printStackTrace();           
  44.     } catch (SQLException e) {               
  45.         e.printStackTrace();           
  46.     } catch (IOException  e) {               
  47.         e.printStackTrace();           
  48.     }                      
  49.     session.close();       
  50. }    

关于输入输出流

读入流自然要有读入的源头,输出也要输出到某个地方,输出一般是先要输读入,这里连接输入和输出的是一个在内存中的字节数组buffer.这样从数据库中读到这个数组里,输出流在从这个数组中输出到特定的文件格式里

免责声明:文章转载自《Oracle读取Blob数据-通过hibernate》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Tiff格式详解(转载)Host是如何与EC通信的下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

springboot使用druid连接池连接Oracle数据库的基本配置

#阿里连接池配置 #spring.datasource.druid.driver-class-name=oracle.jdbc.driver.OracleDriver #可配可不配,阿里的数据库连接池会通过url自动搜寻 spring.datasource.druid.url=jdbc:oracle:thin:@localhost:1521:orcl...

【Modbus】Java使用 modbus-master-tcp 读取和写入Modbus服务器数据

参考了云逸的 Java实现ModbusTCP通信1、前言 在井下综采面需要用到工业级控制协议,采用了Modbus主站从站通讯方式,直接操作寄存器数据,实现读取和控制。 2、引用pom <dependency> <groupId>com.digitalpetri.modbus</group...

《深入浅出WPF》笔记——命令篇

 一、认识命令 1.1命令的特点   提到“命令”,我们应该想到命令的发出者,命令的接受者,命令的内容,准备工作,完成任务,回报工作。。。与事件中的发送者,接受者,消息,处理,处理,处理一一对应,如果是单纯的几个对应关系,的确用事件是能够代替的,不过,命令相对事件有其自己的特点的。比如,古时候,如果两个部落发动战争,经常在出军之前,做了充分的准备,才可能一...

java中的数组

什么是数组呢?   数组是用来存储同一种数据类型多个元素的容器     数据类型:可以是基本类型,也可以是引用类型     容器:比如教室(有多个学生;多个桌子等),衣柜(放多个衣服)等,可以存放多个事物 数组的定义格式   数组的定义格式一:     数据类型[] 数组名= new 数据类型[长度] 例: //定义一个长度为3的整型数组 int[] ar...

ElementUI的el-select怎样实现下拉多选并实现给下拉框赋值和获取值

场景 要实现的效果如下 官方示例代码实现多选 为el-select设置multiple属性即可启用多选,此时v-model的值为当前选中值所组成的数组。 默认情况下选中值会以 Tag 的形式展现,你也可以设置collapse-tags属性将它们合并为一段文字。 <template> <el-select v-model="valu...

浅谈银行数据仓库:数据集市建模思路 ——监管报送项目的数据集市建模实践

前言:数据集市的目标   数据集市,是数据仓库 ADM 层最主要的数据形态,应用在特定业务场景的高度汇总数据,支持特定人员或部门进行数据分析、统计、决策等行为。(数据仓库分层架构及建设思路可查阅作者的《浅谈银行数据仓库的构建之路》)概念理解起来不难,难在如何制定数据集市的落地方式,这时必须结果导向,从实现目标进行反推。 数据集市的目标   从概念可以了解,...