在Hibernate中实现Blob和Clob字段的数据访问

来源:互联网 发布:数据库分析师 编辑:程序博客网 时间:2024/05/04 05:02

JDBC中提供Blob接口

1) java.sql.Blob接口中的主要方法介绍:

getBinaryStream():以流的形式检索此Blob实例指定的BLOB值,其返回值为InputStream对象

Long length():返回由此BLOb对象指定的BLOB值中的字节数

2) 读出Blob类型的字段数据方法:

利用Blob接口中的getBinaryStream()方法,可以获得inputStream对象,从而获得二进制的数据流,转换为某个输出流。

 

JDBC中提供Clob接口

1) java.sql.Clob接口中的主要方法介绍:

getCharacterStream():以java.io.Reader对象形式检索此Clob对象指定的CLOB

Length():检索此Clob对象指定的CLOB对象中的字符数

getSubStringlong pos, int length):检索此Clob对象指定的CLOB值中指定的子字符串的副本

2) 读出Clob类型的字段数据方法:

读出Clob接口中的getSubStringlong pos, int length)方法可以获得该内容的复制件。

 

Org.hibernate包中提供了HIbernate类。在该类中提供了createBlobcreateClob 方法,能够很简单的创建出BlobClob类型的对象

createBlob方法定义

Public static Blob createBlob(InputStream stream) throws IOException

createClob 方法定义

Public static Clob createClob(String string)

 

 

实例:

持久类TUser的代码示例:

package com.hibernate;

import java.io.Serializable;
import java.sql.Blob;
import java.sql.Clob;

public class TUser implements Serializable{

 private Integer id;
 private String name;
 private Integer age;
 private Blob picture;
 private Clob resume;
 
 public TUser(){}

 public Integer getId() {
  return id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public Integer getAge() {
  return age;
 }

 public void setAge(Integer age) {
  this.age = age;
 }

 public Blob getPicture() {
  return picture;
 }

 public void setPicture(Blob picture) {
  this.picture = picture;
 }

 public Clob getResume() {
  return resume;
 }

 public void setResume(Clob resume) {
  this.resume = resume;
 }
}

提供一个TUser和tuser数据库表之间的映射文件

<hibernate-mapping>
    <class name="com.hibernate.TUser" table="tuser" >
        <id name="id" type="java.lang.Integer">
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String" column="name"></property>
        <property name="age" type="java.lang.Integer" column="age"></property>
        <property name="picture" type="java.sql.Blob" column="picture"></property>
        <property name="resume" type="java.sql.Clob" column="resume"></property>
    </class>
</hibernate-mapping>

添加一个测试代码类:

public class TestUser {

 public TestUser(){}
 
 public void insertUserInfoToDB() throws IOException{
  Session session = null;
  Transaction tx = null;
  session  = HibernateUtil.currentSession();
  try{
   tx =  session.beginTransaction();
   TUser user = new TUser();
   user.setAge(new Integer(22));
   user.setName("lianglong");
   
   FileInputStream imgi = new FileInputStream("C:/aa.png");
   Blob img = Hibernate.createBlob(imgi);
   user.setPicture(img);   
   Clob resume = Hibernate.createClob("这是clob字段的文本内容");
   user.setResume(resume);
   session.save(user);
   tx.commit();
  }
  catch(Exception e){
   e.printStackTrace();
  }
  finally{
   session.close();
  }
 }
 
 public void selectUserInfoFromDB() throws IOException{
  Session session = null;
  session  = HibernateUtil.currentSession();
  try{
    Transaction tx = session.beginTransaction();
   TUser user = new TUser();
   user = (TUser)session.load(TUser.class, new Integer(1));   
   Clob resume = user.getResume();
   System.out.println(resume.getSubString(1, (int)resume.length()));   
   Blob img = user.getPicture();
   InputStream iS = img.getBinaryStream();
   FileOutputStream fos = new FileOutputStream("d:/aa.png");
   byte[] buf = new byte[1024];
   int len;
   while ((len=iS.read(buf))!=-1){
    fos.write(buf,0,len);
   }
   fos.close();
   iS.close();   
   tx.commit();
  }
  catch(Exception e){
   e.printStackTrace();
  }
  finally{
   session.close();
  }
 }
 
 public static void main(String[] args) throws IOException {
  TestUser oneTestUser = new TestUser();
  oneTestUser.insertUserInfoToDB();
  oneTestUser.selectUserInfoFromDB();
 } 
}

原创粉丝点击