Oracle讀取Blob數據-通過hibernate


通過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.這樣從數據庫中讀到這個數組里,輸出流在從這個數組中輸出到特定的文件格式里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM