通過hibernate向Oracle存儲字節(jié)類型的數(shù)據(jù)(如byte[]等),在定義實(shí)體對象的時候不能用"private byte[] content", 這樣定義我試過,在存儲數(shù)據(jù)的時候(session.save(user))是沒有問題的,但是在讀取Blob字段(Oracle中存儲byte[]使用的是"BLOB"類型)時就會出現(xiàn)問題,讀出來的東西就成了亂碼.
-
使用hibernate讀取Blob字段時,實(shí)體對象(對應(yīng)的byte[]類型字段)應(yīng)該這樣定義:
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. ......
15.}
對應(yīng)的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數(shù)據(jù)方法:
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. //將圖片讀進(jìn)輸入流 10. FileInputStream fis = new FileInputStream("c:\\a.jpg"); 11. //轉(zhuǎn)成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. //從數(shù)據(jù)庫中要讀取出來 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. //從數(shù)據(jù)庫中讀取到指定的字節(jié)數(shù)組中 38. while((len = is.read(buffer) )!= -1){ 39. //從指定的數(shù)組中讀取,然后輸出來,所以這里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.}
關(guān)于輸入輸出流
讀入流自然要有讀入的源頭,輸出也要輸出到某個地方,輸出一般是先要輸讀入,這里連接輸入和輸出的是一個在內(nèi)存中的字節(jié)數(shù)組buffer.這樣從數(shù)據(jù)庫中讀到這個數(shù)組里,輸出流在從這個數(shù)組中輸出到特定的文件格式里。
本文出自:億恩科技【mszdt.com】
服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|