`

Hibernate实现Oracle Blob/Clob类型数据读写

阅读更多
环境:Eclipse3.1+Hibernate2+Oracle 10g
说明:本例在使用Eclipse3.1通过一个Java项目来实现对Oracle中Blob/Clob类型数据的读写操作.
1.在oracle数据库中新建一个表,取名:BIGDATA, sql语句如下:
  CREATE TABLE BIGDATA (id number NOT NULL,image blob,resume clob);//新建表
  ALTER TABLE BIGDATA ADD ( CONSTRAINT bigdata_pk PRIMARY KEY (id) USING INDEX );// 修改id为主键:

2.在Eclipse中新建一个java项目,取名:HibernateSample,项目中需要导入的jar文件可根据需要导入即可。
  新建一个源文件夹src,在src下新建一个包,取名bigDataAccess,在该包下新建一个类,取名DataModel.java,内容如下:
package bigDataAccess;

import java.sql.Blob;
import java.sql.Clob;

public class DataModel {
Long id;

Blob image;

Clob resume;

public Long getId() {
  return id;
}

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

public Blob getImage() {
  return image;
}

public void setImage(Blob image) {
  this.image = image;
}

public Clob getResume() {
  return resume;
}

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

2.再在bigDataAccess包下新建一个类取名:HibernateUtil.java用于管理session,源代码如下:
package bigDataAccess;

import net.sf.hibernate.*;
import net.sf.hibernate.cfg.Configuration;

public class HibernateUtil {
private static SessionFactory sessionFactory;

public static final ThreadLocal session= new ThreadLocal();
static {
  try {
   // 实例化一个SessionFactory对象
   //System.out.println("通过静态模块创建一个SessionFactory");
   sessionFactory = new Configuration().configure()
     .buildSessionFactory();
  } catch (HibernateException ex) {
   throw new RuntimeException("Configuration problem:"
     + ex.getMessage(), ex);
  }
}
public static Session currentSession() throws HibernateException {
  Session s = (Session) session.get();
  // 当原session为空或已关闭时,打一个新的Session
  if (s == null || !s.isOpen()) {
   s = sessionFactory.openSession();
   session.set(s);
  }
  return s;
}

public static void closeSession() throws HibernateException {
  Session s = (Session) session.get(); 
  if (s != null) {
   s.close();
  } 
}
}

2.在包bigDataAccess下新建映射文件bigDataAccess.hbm.xml,内容如下:

    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >



 
  
 
 
 


3.新建Hibernate配置文件于src目录下,hibernate.cfg.xml内容如下

                                         "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">



  oracle.jdbc.driver.OracleDriver
  jdbc:oracle:thin:@localhost:1521:orcl
  work
  caecaodb
  true
  net.sf.hibernate.dialect.OracleDialect
  
  0
   


4.在包bigDataAccess下新建一个带有main()函数的类,取名HibernateTest.java,源代码如下:
package bigDataAccess;
//注意要导入正确有包

public class HibernateTest{

public HibernateTest() throws HibernateException, SQLException, IOException {
  doit();
}

public static void main(String[] args) throws HibernateException,
   SQLException, IOException {
  new HibernateTest();

}

public void doit() throws HibernateException, SQLException, IOException {

  // Blog,Clob类型数据读写---------write

  /*
   * Oracle Blob/Clob字段本身有一个游标(cursor),
   * JDBC通过游标对Blob/Clob字段进行操作,在Blob/Clob字段被创建之前,
   * 无法获得其游标句柄,因此必须首先创建一个空Blob/Clob字段,再从空这个空Blob/Clob字段获取游标,再写入要保存的数据
   */
  System.out.println("写入数据");
  Session session = HibernateUtil.currentSession();
  Transaction tx = session.beginTransaction();

  DataModel info = new DataModel();
  info.setImage(Hibernate.createBlob(new byte[1]));
  info.setResume(Hibernate.createClob(" "));// 这里的参数是一个空格
  session.save(info);
  session.flush();// 强制执行insert
  // 通过refresh方法,强制Hibernate执行select for update
  session.refresh(info, LockMode.UPGRADE);

  // 向Blog写入实际内容
  oracle.sql.BLOB blob = (oracle.sql.BLOB) info.getImage();
  FileInputStream imgis = new FileInputStream("d:\\image.jpg");//在d:\根目录下放一个image.jpg的文件
  OutputStream out = blob.getBinaryOutputStream();
  byte[] buf = new byte[10240];
  int len;
  while ((len = imgis.read(buf)) > 0) {
   out.write(buf, 0, len);
  }
  imgis.close();
  out.close();

  // 向Clob写入实际内容
  oracle.sql.CLOB clob = (oracle.sql.CLOB) info.getResume();
  Writer writer = clob.getCharacterOutputStream();
  writer.write("this is my resume");
  writer.close();

  session.save(info);
  tx.commit();
  //读取刚才写入数据库的数据
  System.out.println("读取数据");
  DataModel info1 = (DataModel) session
    .load(DataModel.class, new Long(1));
  Clob resume = info1.getResume();
  System.out.println("resume="
    + resume.getSubString(1, (int) resume.length()));

  Blob img = info1.getImage();
  InputStream is = img.getBinaryStream();
  FileOutputStream fos = new FileOutputStream("d:\\outimage.jpg");//读取到d:\outimage.jpg
  byte[] buf1 = new byte[10240];
  int len1;
  while ((len1 = is.read(buf1)) != -1) {
   fos.write(buf1, 0, len1);
  }
  fos.close();
  is.close();
  session.close();
}

右击HibernateTest.java,将其运行为java应用程序,查询bigdata表则会新增了一条记录,d:\有一个名为:outimage.jpg的文件,说明成功
分享到:
评论

相关推荐

    Hibernate对BLOB CLOB操作

    同时,确保数据库支持高效的BLOB和CLOB操作,比如Oracle的BFILE类型或使用流式处理。 总之,Hibernate提供了对BLOB和CLOB的便利支持,允许开发者在Java应用中轻松地处理大数据对象,从而实现与数据库的高效交互。...

    hibernate动态映射表处理oracle的clob类型

    - 使用Blob/Clob接口:直接操作Clob接口进行读写,而不是将其转换为字符串或其他数据类型,以减少转换开销。 通过以上内容,你应该对在Hibernate中动态映射Oracle 10g的CLOB类型有了深入理解,这将帮助你在实际...

    使用hibernate对oracle读取blob

    Hibernate作为一款流行的ORM(对象关系映射)框架,提供了与Oracle数据库交互的简便方式,包括处理Blob数据。本文将详细介绍如何使用Hibernate和JDBC读取和存储Oracle数据库中的Blob对象。 ### 1. Hibernate Blob...

    spring+hibernate操作oracle的clob字段

    在Spring配置文件中,你需要创建一个`SessionFactory` bean,同时指定一个`lobHandler`属性,用于处理CLOB和BLOB类型的数据。这确保了Spring和Hibernate能够正确地与Oracle数据库交互处理大对象。 ```xml ...

    关于在Hibernate中对于Clob,Blob字段的处理方法

    这些数据类型通常用于存储大量的文本数据(Clob)和二进制数据(Blob),例如长篇文章、图片或音频文件。在Oracle数据库中,Hibernate提供了与这些数据类型的交互方式。本篇将详细介绍在Hibernate中如何处理Clob和...

    Hibernate操作Oarcle中Clob、Blob字段小结

    这篇博客文章“Hibernate操作Oracle中Clob、Blob字段小结”可能会探讨如何在Hibernate中有效地处理这两种类型的数据。 1. **Clob与Blob的理解**: - Clob:Clob是用于存储大量字符数据的类型,例如长篇文章、XML...

    使用Jdbc4操作Blob,Clob

    在Java的数据库编程中,JDBC(Java Database Connectivity)是一个重要的接口,用于与各种数据库进行交互。当涉及到处理大型对象...无论是直接使用JDBC还是结合ORM框架,都可以灵活地实现对Blob和Clob的读写操作。

    java将图片写入数据库,并读出来(blob clob)

    这个过程通常涉及到Blob和Clob数据类型,它们是Java中的两种特殊对象,用于存储大对象(LOB)。Blob用于存储二进制数据,如图片、音频或视频文件,而Clob则用于存储字符数据,比如长文本。以下是如何使用Java处理...

    Spring+Hibernate处理Oracle lob字段(一)

    在Oracle数据库中,LOB字段主要有BLOB(Binary Large Object)和CLOB(Character Large Object)两种类型,分别用于存储二进制和字符数据。处理这些字段时,我们需要配置Hibernate的实体类和映射文件。 在实体类中...

    spring1.2+hibernate2对大字段的处理实例

    1. **Blob/Clob类型**:对于大文本或二进制数据,可以使用数据库的Blob(Binary Large Object)和Clob(Character Large Object)类型。Hibernate2支持将Java的`java.sql.Blob`和`java.sql.Clob`对象映射到数据库的...

    java大对象

    Java大对象(Large Object,简称LOB)是Java数据库连接(JDBC)中用来处理大量数据类型的一个概念,尤其适用于存储图像、音频、视频、文本文件等非结构化数据。在Java编程中,大对象主要涉及到Blob(Binary Large ...

Global site tag (gtag.js) - Google Analytics