在Hibernate中,可以直接对Blob、Clob作映射。

DDL如下:

  1. CREATE TABLE user (
  2.     id INT(11) NOT NULL auto_increment PRIMARY KEY,
  3.     name VARCHAR(100) NOT NULL default '',
  4.     age INT,
  5.     photo BLOB,
  6.     resume TEXT
  7. );

注意:由于BLOB字段大小不可预计,有时需要增大BLOB字段的大小,可在数据库中改用MEDIUMBLOB甚至LONGBLOB。

User.java

  1. package com.hb3.pack_07.model;

  2. import java.sql.Blob;
  3. import java.sql.Clob;

  4. public class User {

  5.     private Integer id;
  6.     private String name;
  7.     private Integer age;
  8.     private Blob photo;
  9.     private Clob resume;
  10.     
  11.     public User() {
  12.     }

  13.     public Integer getId() {
  14.         return id;
  15.     }
  16.     public void setId(Integer id) {
  17.         this.id = id;
  18.     }
  19.     public String getName() {
  20.         return name;
  21.     }
  22.     public void setName(String name) {
  23.         this.name = name;
  24.     }
  25.     public Integer getAge() {
  26.         return age;
  27.     }
  28.     public void setAge(Integer age) {
  29.         this.age = age;
  30.     }
  31.     public Blob getPhoto() {
  32.         return photo;
  33.     }
  34.     public void setPhoto(Blob photo) {
  35.         this.photo = photo;
  36.     }
  37.     public Clob getResume() {
  38.         return resume;
  39.     }
  40.     public void setResume(Clob resume) {
  41.         this.resume = resume;
  42.     }
  43. }

User.hbm.xml文件:

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

  5. <hibernate-mapping>

  6.     <class name="com.hb3.pack_07.model.User" table="user">
  7.     
  8.         <id name="id" column="id" type="java.lang.Integer"> 
  9.             <generator class="native"/> 
  10.         </id> 
  11.         
  12.         <property name="name" column="name" type="java.lang.String"/> 
  13.         
  14.         <property name="age" column="age" type="java.lang.Integer"/> 
  15.         
  16.         <property name="photo" column="photo" type="java.sql.Blob"/>   
  17.               
  18.         <property name="resume" column="resume" type="java.sql.Clob"/> 
  19.         
  20.     </class>
  21.     
  22. </hibernate-mapping>

修改hibernate.cfg.xml文件如下:

......

<mapping resource="com/hb3/pack_07/model/User.hbm.xml" />

......

 

测试代码如下:

  1. package com.hb3.pack_07;

  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.sql.Blob;
  7. import java.sql.Clob;
  8. import java.sql.SQLException;

  9. import org.hibernate.Hibernate;
  10. import org.hibernate.Session;
  11. import org.hibernate.SessionFactory;
  12. import org.hibernate.Transaction;
  13. import org.hibernate.cfg.Configuration;

  14. import com.hb3.pack_07.model.User;

  15. public class BusinessService {

  16.     public static void main(String[] args) throws IOException, SQLException {
  17.         
  18.         Configuration config = new Configuration().configure();
  19.         SessionFactory sessionFactory = config.buildSessionFactory();      
  20.         Session session = sessionFactory.openSession();

  21.         FileInputStream fileInputStream = new FileInputStream("c:\\sunset.jpg");
  22.         Blob photo = Hibernate.createBlob(fileInputStream);
  23.         Clob resume = Hibernate.createClob("Bla....Bla....resume text!!");
  24.                 
  25.         User user = new User();
  26.         user.setName("shenbin");
  27.         user.setAge(new Integer(28));
  28.         user.setPhoto(photo);
  29.         user.setResume(resume);

  30.         Transaction tx = session.beginTransaction();
  31.         session.save(user); 
  32.         tx.commit();
  33.         
  34.         session.close();
  35.         session = sessionFactory.openSession();
  36.         
  37.         user = (User) session.load(User.classnew Integer(1));
  38.         System.out.print(user.getAge() + "\t" +
  39.                          user.getName() + "\t");
  40.         String str_resume = user.getResume().getSubString(1, (int) user.getResume().length());
  41.         System.out.println(str_resume);
  42.         InputStream inputStream = user.getPhoto().getBinaryStream();
  43.         FileOutputStream fileOutputStream = new FileOutputStream("c:\\sunset_save.jpg");
  44.         byte[] buf = new byte[1];
  45.         int len = 0;
  46.         while((len = inputStream.read(buf)) != -1) {
  47.             fileOutputStream.write(buf, 0, len);
  48.         }
  49.         inputStream.close();
  50.         fileOutputStream.close();  
  51.         System.out.println("save photo to c:\\sunset_save.jpg");

  52.         session.close();
  53.         sessionFactory.close();
  54.     }
  55. }

在MySQL中对BLOB以及CLOB类型的使用还是比较简单的,如果在Oracle DB中则相对复杂一些,计划在以后章节加以说明。



ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程