`

关于Oracle的BLOB、CLOB字段的操作方法(分JDBC和Hibernate两种)持续更新中...

阅读更多

注意:本文采用JDK1.6 和 Oracle ojdbc6 驱动,基于ORALCE 9I 数据库, ojdbc6对应jdk1.6,如果本文的有些函数方法在别的地方不可用或者出现一些莫名其妙的错误,那多半是因为驱动的原因。。。

本文程序所用ojdbc6驱动下载地址:http://d.download.csdn.net/down/2261415/zhouqingying_java

 

总结:不具有格式的文本如txt,String适合用CLOB,通过缓冲字符流来存;而具有格式的如JPEG,DOC,PPT等文件适合用BLOB,通过缓冲字节流来存。

 

 

首先是建一张名为LOBTEST的测试表 字段 ID(NUMBER)、UNAME(VARCHAR2)、JIANJIE(CLOB)、TOUXIANG(BLOB)

 

1、JDBC的操作方法

(1)往数据库存储CLOB和BLOB型字段数据。数据来源文本文件和图片文件,演示代码如下:

 

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class InsertLob {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		try {
			long startTime=System.currentTimeMillis();
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url="jdbc:oracle:thin:@192.168.130.131:1521:ICSS";
			String user="lixiang";
			String password="19870924";
			Connection conn=DriverManager.getConnection(url,user,password);
			conn.setAutoCommit(false);//这句很重要
			
			//1、插入一条LOB字段都是空值的记录
			String inSql="insert into LIXIANG.LOBTEST(ID,UNAME,JIANJIE,TOUXIANG)values(?,?,?,?)";
			PreparedStatement preStm=conn.prepareStatement(inSql);
			preStm.setInt(1, 1);
			preStm.setString(2, "奶茶妹妹");
			preStm.setClob(3, oracle.sql.CLOB.getEmptyCLOB());//引入oracle的ojdbc6.jar驱动包后可用
			preStm.setBlob(4, oracle.sql.BLOB.getEmptyBLOB());//先往表里LOB字段插入空值,关于这样的做法许多别的文章有讲解原因。
			preStm.executeUpdate();
			preStm.close();
			
			//2、将该条记录再取出,然后对LOB字段传入你要保存的数据
			String outSql="select JIANJIE,TOUXIANG from LIXIANG.LOBTEST where ID=? for update";
			preStm=conn.prepareStatement(outSql);
			preStm.setInt(1, 1);
			ResultSet rst=preStm.executeQuery();
			rst.next();
			oracle.sql.CLOB clob=(oracle.sql.CLOB)rst.getClob(1);
			oracle.sql.BLOB blob=(oracle.sql.BLOB)rst.getBlob(2);
		    BufferedInputStream bis=new BufferedInputStream(new FileInputStream("D:\\naicha.jpeg"));//D盘根目录下有个名为naicha.jpeg的图片
		    BufferedOutputStream bos=new BufferedOutputStream(blob.setBinaryStream(0));
		    byte[] buf=new byte[10240];//10K字节的缓存 以字节流的方式传输
		    int len;
		    while((len=bis.read(buf))!=-1){
		    	bos.write(buf);
		    }//关于JAVA输入输出流的东西 http://muzixiang.iteye.com/blog/912451
		    bis.close();
		    bos.close();
		    BufferedReader br=new BufferedReader(new FileReader("D:\\test.txt"));//D盘根目录下有个名为test.txt的文本文件
		    BufferedWriter bw=new BufferedWriter(clob.setCharacterStream(0));
		    char[] cbuf=new char[1024];//1K的字符缓存 以字符流的方式传输
		    while((len=br.read(cbuf))!=-1){
		    	bw.write(cbuf);
		    }//关于JAVA输入输出流的东西 http://muzixiang.iteye.com/blog/912451
		    br.close();
		    bw.close();
		    rst.close();
		    preStm.close();
		    
		    //3、将Blob Clob字段更新到数据库 这步必不可少!
		    String upSql="update LIXIANG.LOBTEST set JIANJIE=?,TOUXIANG=? where ID=?";
		    preStm=conn.prepareStatement(upSql);
		    preStm.setClob(1, clob);
		    preStm.setBlob(2, blob);
		    preStm.setInt(3, 1);
		    preStm.executeUpdate();
		    preStm.close();
		    conn.commit();//前面设置conn.setAutoCommit(false)所以这里勿忘手动提交!
		    conn.close();
		    
		    long endTime=System.currentTimeMillis();
		    long totalTime=endTime-startTime;
		    System.out.println("程序总共运行了"+totalTime+"毫秒");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 

D:\test.txt的内容如下 保存到数据库后打开表我们发现CLOB字段保存文本中的格式,也是按照两行来存储的!

 

 

 

(2)从数据库中读出CLOB和BLOB型数据。将数据读取到文本文件和图片文件,演示代码如下:

 

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class getLob {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		try {
			long startTime=System.currentTimeMillis();
			
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url="jdbc:oracle:thin:@192.168.130.131:1521:ICSS";
			String user="lixiang";
			String password="19870924";
			Connection conn=DriverManager.getConnection(url,user,password);
			
			conn.setAutoCommit(false);//这句很重要
			String sql="select JIANJIE,TOUXIANG from LIXIANG.LOBTEST where id=?";
			PreparedStatement preStm=conn.prepareStatement(sql);
			preStm.setInt(1, 1);
			ResultSet rst=preStm.executeQuery();
			rst.next();
			oracle.sql.CLOB clob=(oracle.sql.CLOB)rst.getClob("JIANJIE");//有的程序里用的是java.sql.Clob类和java.sql.Blob类不需要强制转换也实现目的了。。
			oracle.sql.BLOB blob=(oracle.sql.BLOB)rst.getBlob("TOUXIANG");
			
			BufferedReader br=new BufferedReader(clob.getCharacterStream());
			BufferedWriter bw=new BufferedWriter(new FileWriter(new File("D:\\Clob.txt")));
			BufferedInputStream bis=new BufferedInputStream(blob.getBinaryStream());
			BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(new File("D:\\Blob.jpeg")));
			
			char[] cbuf=new char[1024];
			int len;
			while((len=br.read(cbuf))!=-1){
				bw.write(cbuf);
				bw.flush();//这句非常重要,一开始就是因为没有加这句导致没有成功将数据库内容输出到文本文件里
			}
			
			byte[] buff=new byte[10240];
			while((len=bis.read(buff))!=-1){
				bos.write(buff);
				bos.flush();
			}
			
			rst.close();
			preStm.close();
			conn.commit();
			conn.close();
			
			long endTime=System.currentTimeMillis();
			long totalTime=endTime-startTime;
			System.out.println("程序总共运行了"+totalTime+"毫秒");		
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

输出效果如下:


另外附上可爱的奶茶妹妹经典图片:

 

 

  • 大小: 14.7 KB
  • 大小: 15 KB
  • 大小: 50 KB
0
0
分享到:
评论

相关推荐

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

    本篇将详细介绍在Hibernate中如何处理Clob和Blob字段,以及使用特定Oracle JDBC驱动程序的优势。 首先,Hibernate通过`org.hibernate.type`包中的`ClobType`和`BlobType`来映射Clob和Blob。在实体类中,你需要定义...

    spring+hibernate操作oracle的clob字段

    在J2EE开发中,处理大数据对象(如大文本或二进制数据)时,Oracle数据库的CLOB...通过以上配置和操作,你可以在Spring和Hibernate的环境中顺利地对Oracle数据库的CLOB字段进行读写,满足J2EE应用中的大数据存储需求。

    spring+hibernate 解决大字段(clob)

    其中,`hibernate.jdbc.batch_size`设置为0表示禁用批处理,这对于处理CLOB字段尤为重要,因为批处理可能会导致CLOB数据被截断。 #### 三、Hibernate HBM文件配置 在Hibernate映射文件(HBM文件)中,也需要正确...

    使用hibernate对oracle读取blob

    综上所述,使用Hibernate和JDBC读取Oracle数据库中的Blob数据涉及多个步骤,包括实体类的设计、数据库操作和文件流的处理。理解这些知识点对于处理大对象存储至关重要。在实际项目中,根据需求和性能考虑,选择合适...

    hibernate保存blob,clob对象

    在Java的持久化框架Hibernate中,处理大数据类型如BLOB(Binary Large Object)和CLOB(Character Large Object)是一项常见的任务。BLOB用于存储二进制数据,如图片、视频或文档,而CLOB则用于存储大文本数据,如...

    解析使用jdbc,hibernate处理clob/blob字段的详解

    这篇文章主要讲解了如何使用`JDBC`和`Hibernate`这两种不同的方式来处理`CLOB`和`BLOB`字段。 1. **数据库中的`CLOB`与`BLOB`类型** - 在MySQL中,`CLOB`对应`TEXT`类型,`BLOB`对应`BLOB`类型。 - 在DB2或Oracle...

    关于Clob类型在Hibernate中 的应用小结

    在Hibernate的XML映射文件中,你需要为这个Clob字段指定映射规则,例如: ```xml <property name="summaryClob" type="org.hibernate.type.ClobType"> <column name="SUMMARY_CLOB" /> ``` **CRUD操作**: ...

    Struts2 Hibernate存取Oracle数据库中的BLOB数据.pdf

    在实际操作中,可以通过Hibernate实现Oracle数据库中BLOB数据的存储和删除操作,然后利用Struts2框架展示这些BLOB数据。这样的结合,不仅可以提高开发效率,还能保证应用的性能和稳定性。 ### 实际操作步骤 在实际...

    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的实体类和映射文件。 在实体类中...

    Hibernate操作数据库大字段的示例(附源码及详细开发使用方法)。

    在Hibernate配置文件(hibernate.cfg.xml)中,确保已经正确设置了数据库连接参数,并且JDBC驱动支持大字段的处理。对于支持大字段的数据库,如MySQL,Oracle等,通常不需要额外配置。 **二、实体类** 在实体类中...

    ssh(structs,spring,hibernate)框架中的上传下载

     文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的...

    Spring中文帮助文档

    处理BLOB 和 CLOB对象 11.7.3. 在IN语句中传入一组参数值 11.7.4. 处理复杂类型的存储过程调用 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. Hibernate 12.2.1. 资源管理 12.2.2. 在Spring容器中创建 ...

    Hibernate学习笔记

    Hibernate是一款广泛应用于Java开发中的ORM(对象关系映射)框架,它的主要目标是简化数据库操作,将数据库的CRUD(创建、读取、更新、删除)操作转化为对Java对象的操作。通过Hibernate,开发者可以避免编写大量的...

    马士兵hibernate学习笔记

    - **CLOB/BLOB 类型处理**:介绍如何处理大文本(CLOB)和大数据块(BLOB)类型的字段。 - **自定义数据类型**:通过实现 `org.hibernate.usertype.UserType` 接口来自定义数据类型。 通过以上内容的学习,可以全面...

    Spring API

    处理BLOB 和 CLOB对象 11.7.3. 在IN语句中传入一组参数值 11.7.4. 处理复杂类型的存储过程调用 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. Hibernate 12.2.1. 资源管理 12.2.2. 在Spring容器中创建 ...

    hibernate的一份知识点总结

    - `hibernate.cfg.xml`配置文件中,`hbni2ddl.auto`控制数据库结构的自动更新。 - 设置日志,展示SQL语句。 - 使用jUnit进行单元测试。 - 配置表名、字段名、日期类型等。 **5. ID生成策略** - **策略**:包括...

Global site tag (gtag.js) - Google Analytics