Hibernate 操作Blob Clob

Photo.java

import java.sql.Blob;   

import java.sql.Clob;   


import java.util.Date;   

  

/**  
 * @author IBM 这是一个用于测试Hibernate大对象操作的PO  
 *   
 *         这是一个测试POJO, 属性有多种类型  
 */  

public class Photo {   


    private Long id;   


    private String fileName="";// 文件名   


    private Date date = new Date(); // 主库时间,默认值是当前时间   


    private Blob photo;// 相片的二进制形式,大对象   


    private Clob text;// 文字说明,大对象   


    private byte[] bin;//字节数组   

}  
import java.sql.Blob;
import java.sql.Clob;
import java.util.Date;

/**
 * @author IBM 这是一个用于测试Hibernate大对象操作的PO
 * 
 *         这是一个测试POJO, 属性有多种类型
 */
public class Photo {
	private Long id;
	private String fileName="";// 文件名
	private Date date = new Date(); // 主库时间,默认值是当前时间
	private Blob photo;// 相片的二进制形式,大对象
	private Clob text;// 文字说明,大对象
	private byte[] bin;//字节数组
}

Photo.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>   
<!DOCTYPE hibernate-mapping PUBLIC    

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  


    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   


<hibernate-mapping package="test.com.base">   


    <class name="Photo" table="test_Photo">   


        <id name="id">   


            <generator class="native"/>   

        </id>            

        <property name="fileName" />   


        <property name="date" />   


        <property name="photo" />   


        <property name="text" />   


        <property name="bin" />   


    </class>     

</hibernate-mapping>  
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="test.com.base">
	<class name="Photo" table="test_Photo">
		<id name="id">
			<generator class="native"/>
		</id>			
		<property name="fileName" />
		<property name="date" />
		<property name="photo" />
		<property name="text" />
		<property name="bin" />
	</class>	
</hibernate-mapping>

PhotoManagerImpl.java

其中继承了BaseDao类,这是一个通用Hibernate 泛型DAO工具类
package test.com.base;   

import java.io.File;   


import java.io.FileOutputStream;   


import java.io.InputStream;   


import java.io.OutputStream;   


import java.io.Reader;   


import java.nio.CharBuffer;   


import java.sql.Clob;   


import org.springframework.stereotype.Service;   


import org.springframework.transaction.annotation.Transactional;   


import com.base.dao.BaseDao;   


@Transactional  


@Service    


public class PhotoManagerImpl extends BaseDao<Photo,Long> {   


    //空   

}  
package test.com.base;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.nio.CharBuffer;
import java.sql.Clob;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.base.dao.BaseDao;
@Transactional
@Service 
public class PhotoManagerImpl extends BaseDao<Photo,Long> {
	//空
}

BaseDaoBlobClobTest.java

其中用到了JUnitBase_svc类,作用是加载spring的配置文件
package test.com.base;   
  

import java.io.File;   


import java.io.FileOutputStream;   


import java.io.IOException;   


import java.io.InputStream;   


import java.io.OutputStream;   


import java.io.Reader;   


import java.sql.Blob;   


import java.sql.Clob;   


import javax.annotation.Resource;   


import org.hibernate.Hibernate;   


import org.hibernate.LockMode;   


import org.hibernate.Session;   


import org.hibernate.Transaction;   


import org.junit.Test;   


import com.base.dao.BaseDao;   

  

/**  
 * 通过个单元测试,演示了<br/>  
 * 1: 如何操作大象<br/>  
 * 2:懒加载的一种解决方案<br/>  
 */  

public class BaseDaoBlobClobTest extends JUnitBase_svc {   


    @Resource  


    private PhotoManagerImpl photoManagerImpl;    

  

    /**  
     * 测试保存大对象    
     */  

    @Test  


    public void TestSaveBlob() {   


        // ----------456.jpg 转成Blob--------------------   


        InputStream in = this.getClass().getResourceAsStream("phtot.jpg");   


        Blob blob = null;   


        try {   

            blob = Hibernate.createBlob(in);   

        } catch (IOException e) {   

            e.printStackTrace();   
        }   

        // ----------文字 转成Clob--------------------   


        Clob clob = Hibernate.createClob("文字 转成Clob");   

  

        // ------------------------------------------   


        Photo photo = new Photo();   


        photo.setFileName("haha.jpg");   

        photo.setPhoto(blob);   
        photo.setText(clob);   
        photoManagerImpl.save(photo);   
    }   
  

    /**  
     * 测试取得大对象,没有使用懒加载,  
     */  

    @Test  


    public void TestGetBlob() {   

  

        Photo photo = photoManagerImpl.get(3L);// 执行Hibername的get方法,会马上执行SQL查询   

  

        int len = 0;   


        byte[] buf = new byte[1024];   


        try {   


            String path = "d:\\abc.jpg";// 取出图片后保存的位置   

            InputStream in = photo.getPhoto().getBinaryStream();   

            OutputStream out = new FileOutputStream(new File(path));   


            while ((len = in.read(buf)) > 0) {   


                out.write(buf, 0, len);   

            }   
            out.close();   
            in.close();   

            System.out.println("读出的图片放在了:" + path);   

  
            Clob clob = photo.getText();   
            Reader reader = clob.getCharacterStream();   

            char[] cb = new char[1024];   


            StringBuffer sb = new StringBuffer();   


            len = 0;   


            while ((len = reader.read(cb)) > 0) {   


                sb.append(cb, 0, len);   

            }   
            System.out.println(sb.toString());   
  

        } catch (Exception e) {   

            e.printStackTrace();   
        }   
    }   
  

    /**  
     * 测试取得大对象,使用了懒加载,   
     *   
     * 并且是在事务已提交,session已关闭后才通过Hibernate代理查出的目标对象  
     *   
     * 这是懒加载的一种解决方案,很重要,特此说明  
     */  

    @Test  


    public void TestLoadBlob() {   

           

        // 执行的是load方法,会延迟加载,返回Hibernate代理对象之后session已关闭   

        Photo photo = photoManagerImpl.load(3L);   
           

        //打开一个新Session,不能使用getCurrentSession()方法   

        Session session = photoManagerImpl.getNewSession();   
           

        System.out.println("Session是打开的吗:"+session.isOpen());   

           

        // 把Hibernate代理对象重新关联到一个session对象   

        session.lock(photo, LockMode.NONE);   
           

        //开启事务   

        Transaction t=session.beginTransaction();   
  

        int len = 0;   


        byte[] buf = new byte[1024];   


        try {   


            String path = "d:\\abc.jpg";// 取出图片后保存的位置   

               

            //这时才发出sql语句,执行查询,达到了懒加载的目的   

            InputStream in = photo.getPhoto().getBinaryStream();   
               

            OutputStream out = new FileOutputStream(new File(path));   


            while ((len = in.read(buf)) > 0) {   


                out.write(buf, 0, len);   

            }   
            out.close();   
            in.close();   

            System.out.println("读出的图片放在了:" + path);   

  
            Clob clob = photo.getText();   
            Reader reader = clob.getCharacterStream();   

            char[] cb = new char[1024];   


            StringBuffer sb = new StringBuffer();   


            len = 0;   


            while ((len = reader.read(cb)) > 0) {   


                sb.append(cb, 0, len);   

            }   
            ;   
            System.out.println(sb.toString());   
  

        } catch (Exception e) {   

            e.printStackTrace();   
        }   
        System.out.println(t==session.getTransaction());   

        //提交事务   

        session.getTransaction().commit();   

        //关闭   

        session.close();   
    }   
}  

相关推荐