Blob对象是SQL Blob的Java语言映射。SQL Blob是一个内置类型,它可以将一个二进制大对象保存在数据库中。接口ResultSet、CallableStatement和PreparedStatement中的方法允许程序员使用与访问SQL 92内置类型同样的方式来访问SQL 99类型BLOB。
 在标准实现中,JDBC驱动程序在后台使用SQL类型LOCATOR(BLOB)来实现Blob接口。LOCATOR(BLOB)指向保存在数据库服务器上的SQL BLOB值,而且这些操作作用在这个LOCATOR(定位器)上与作用在BLOB值本身有同样的结果。
 意味着用户可以在一个Blob实例上执行操作而不必将这个BLOB数据物化到用户上,这将显著的提高性能。因为驱动程序在后台使用LOCATOR(BLOB),所以它的使用对程序员是完全透明的。

Blob实例的标准行为一直保持有效,直到这个事务(创建一个Blob的事务)执行了提交或者回滚操作。

1、创建Blob对象
下面的代码说明了如何创建一个Blob对象,其中stmt是一个Statement对象:

Statement stmt = con..createStatement(ResultSet.TYPE_INSENSITIVE,
              ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.excuteQuery(“SELECT DATA  FROM  TABLE 1”);

If (rs.next()){
   rs.first();
   Blob blob=rs.getBlob(“DATA”);
}

变量blob包含一个指向BLOB值的逻辑指针,该BLOB值保存在结果集rs的第一行的DATA列中。即使变量blob实际上并不包含BLOB值中的数值,应用程序在blob上执行操作仍然像在实际的数据上执行一样。即应用程序在blob上所作的任何操作都会对表中的BLOB值起作用。

2、物化BLOB数据

开发人员可以在Blob对象上调用JDBC API中的方法,就像这些方法直接
在该对象所指向的SQL BLOB上执行操作一样。然而,如果想在BLOB数据上执行操作,就必须首先将BLOB数据物化到客户。Blob接口提供了两个方法来物化BLOB数据:getBinaryStream,这个方法将BLOB数据物化为一个输入流;getBytes,这个方法将BLOB值得一部分或者全部物化为一个字节数组。下面的代码说明了如何将Blob所指向的BLOB值得全部物化为一个输入流:

java.io.InputStream in = blob.getBinaryStream();
    byte b;
    while((b = in.read()) >-1){
      System.out.println(b);
    }
接下来的代码同样物化了blob所指向的BLOB值得所有数据,但是它产生的是字节数组而不是输入流。

long len = blob.length();
    byte [] data = blob.getBytes(1,len);
    for(int i=0;i<len;i++){
      byte b = data[i];
      System.out.println(b);
    }
变量data复制了blob所指向的BLOB值的所有字节。这是因为传递给方法getBytes的参数值说明了整个BLOB值:第一个参数表示从第一个字节开始返回字节,第二个参数说明它返回的字节长度是BLOB值的长度。
需要说明的是,因为SQL和Java语言之间的不同,一个BLOB值得第一个字节在位置1,而Java数组的第一个元素的索引是0。

3、存储Blob值
若要在数据库中存储Blob值,应用程序可以把它作为一个参数传递给
PreparedStatement的方法setBlob。下面的代码就实现了这个功能:
   Blob stats = rs.getBlob(“STATS”);
   PreparedStatement pstmt= con.preparedStatement(
“UPDATE SIGHTINGS SET MEAS= ? WHERE  AREA = ‘BEIJING’ ”);
   pstmt.setBlob(1,stats);
   pstmt.excuteUpdate();

FileInputStream fis1 = new FileInputStream("D:/aa.jpg");
pstmt.setBinaryStream(1, fis1, fis1.available());
  
4、发现Blob对象中的模式
如果一个Blob对象包含一个给定的字节集合,应用程序可以使用方法
position的两个方法来找到它。其中一个方法搜索一个给定的字节数组,而另一个在一个Blob对象中搜索一个给定的Blob对象。如果发现一个匹配的结果,则返回该模式字节的起始位置。

5、修改Blob对象的方法
JDBC 3.0 API中新增的方法setBytes和setBinaryStream允许应用程序对Blob对象进行修改。

方法setBytes有两个方法来向Blob对象添加数据。其中一个方法增加给定的字节数组的全部内容,而另一个方法增加给定字节数组的特定部分。两个方法都使用一个参数说明向Blob对象插入数据的起始位置。例如,下面的代码段在一个Blob对象blob1的第一个字节处写入整个字节数组bytes。在这种情况下,bytes包含了Blob对象blob的所有字节,因此执行的结果是blob2被写入了blob1的起始处。需要注意的是如果blob2的长度是1024字节,那么blob2的1024各字节将覆盖blob1的开头的1024各字节。
    byte [] bytes = blob2.getBytes(1,blob2.length());
    blob.setBytes(1,bytes,0,512);

下面的代码段说明如何仅仅向Blob对象加入一个字节数组的特定部分。在这种情况下,方法setBytes接受两个附加的参数来说明需要增加字节数组的哪一个部分。其中一个参数指明了这个字节数组的起始偏移量,另一个参数说明这个字节数组包含多少个连续的字节。
    byte [] bytes={……};
    blob.setBytes(1,bytes,0,512);
除了可以向Blob对象增加字节之外,Blob接口还提供了删除字节的方法。方法truncate接受一个字节数目作为一个参数并且根据这个数目来缩短Blob对象。

6、定位器和更新
在标准实现中,指向SQL BLOB的Blob对象使用了SQL LOCATOR类型。定位器(locator)是一个指向保存在数据库中的BLOB值的指针,而DBMS如何更新一个作为定位器实现的对象则依赖于具体的数据库。某些DBMS会更新表中的BLOB值,而另一些则仅仅更新BLOB值的一个副本,并不改变数据库中的值。在后一种情况下,应用程序必须直接更新BLOb值。

为了发现DBMS是如何更新BLOB值的,应用程序可以调用DatabaseMetaData的方法locatorsUpdateCopy。如果这个方法返回true,则应用程序必须自己更新数据库中的BLOB值。下面的代码显示了这个过程:首先从rs取回Blob对象,然后把它的值改为字节数据val的值。如果方法locatorsUpdateCopy返回true,那么它随后执行一个PreparedStatement对象来更新数据库中的值。如果方法locatorsUpdateCopy返回false,代码什么也不用做,因为数据库中的值已经被更新过了。
    byte [] val ={0,1,2,3,4};
    Blob data =rs.getBlob(“DATA”);
    int numWritten = data.setBytes(1,val);
    if (dbmd.locatorUpdateCopy() == true){
      PreparedStatement pstmt= con . preparedStatement(
“UPDATE statistics SET DATA = ? WHERE REGION = ‘BEIJING’ “);
      pstmt.setBlob(“DATA”,data);
      pstmt.executeUpdate();
}

JAVA处理Blob大对象的更多相关文章

  1. JAVA存取PG大对象类型OID数据

    转载地址:http://my.oschina.net/liuyuanyuangogo/blog/151537 pg用大对象存储二进制数据的老文档:http://jdbc.postgresql.org/ ...

  2. JAVA操作ORACLE大对象

    一:操作CLOB  (1)数据库表结构如下:         create table CLOB_TEST      (         ID      VARCHAR2(5) not null,   ...

  3. JDBC处理CLOB 和 BLOB大对象

    在数据库中: clob用于存储大量的文本数据 可以使用字符流操作 clob用于存储大量的二进制数据 可以使用字节流操作 以mysql为例 先准备一张表: CREATE TABLE `t_user2` ...

  4. Java数据库——处理大数据对象

    处理大数据对象 CLOB中可以存储海量文字 BLOB中可以存储海量二进制数据 如果程序中要想处理这样的大对象操作,则必须使用PreparedStatement完成,所有的内容要通过IO流的方式从大文本 ...

  5. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. BLOB:大数据,大对象,在数据库中用来存储超长文本的数据,例如图片等

    将一张图片存储在mysql中,并读取出来(BLOB数据:插入BLOB类型的数据必须使用PreparedStatement,因为插入BLOB类型的数据无法使用字符串拼写): -------------- ...

  7. Spring 让 LOB 数据操作变得简单易行,LOB 代表大对象数据,包括 BLOB 和 CLOB 两种类型

    转自:https://www.ibm.com/developerworks/cn/java/j-lo-spring-lob/index.html 概述 LOB 代表大对象数据,包括 BLOB 和 CL ...

  8. 使用 hibernate 存取大对象数据类型(clob和blob)

    数据库表如下: book表 id 该表的主键.number类型. photo 代表图书的图片,blob类型. description 图书的描述,clob类型. 使用 hibernate3 往 boo ...

  9. oracle对大对象类型操作:blob,clob,nclob

     1.基本介绍 Oracle和plsql都支持lob(large object) 类型,用来存储大数量数据,如图像文件,声音文件等.Oracle 9i realse2支持存储最大为4g的数据,or ...

随机推荐

  1. Hibernate(十二):HQL查询(一)

    概述 Hibernate提供了以下几种检索对象的方式 1)导航对象图检索方式:根据已经加载的对象导航到其他对象: 2)OID检索方式:按照对象的OID来检索对象: 3)HQL检索方式:使用面向对象的H ...

  2. jacascript DOM节点——节点关系与操作

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 节点关系 DOM可以将任何HTML描绘成一个由多层节点构成的结构.每个节点都拥有各自的特点.数据和方法,也 ...

  3. 【转】如何使用slave_exec_mode优雅的跳过1032 1062的复制错误

    今天线上的主从复制发生1062的错误,使用sql_slave_skip_counter跳过之后,由于后面的事务需要对刚刚的数据进行update,后续造成了新的1032的错误. 后来,无意中发现还有更好 ...

  4. 确保 PHP 应用程序的安全 -- 不能违反的四条安全规则

    规则 1:绝不要信任外部数据或输入 关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据.外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据. ...

  5. Treap讲解

    Treap讲解 上一篇blog提出了Treap这个算法,在这里我就要详细讲解. 首先,我们可以从字面上理解这个算法,Treap这个单词是由Tree和Heap两个单词构成的,所以它的性质就很好理解了,明 ...

  6. [C#]在 DotNetCore 下的 Swagger UI 自定义操作

    1.Swagger UI 是什么? Swagger UI 是一个在线的 API 文档生成与测试工具,你可以将其集成在你的 API 项目当中. 支持 API 自动同步生成文档 高度自定义,可以自己扩展功 ...

  7. Caffe+VS2015+python3的安装(基于windows)

    在网上找了许多安装Caffe的教程 感觉全都是杂乱无章的 而且也没有详细的 只能自己当小白鼠来实验一次了 本次配置:CUDA 8.0+ CUDNN  +VS 2015 +Python 3.5 + Ca ...

  8. 【BZOJ1040】【ZJOI2008】骑士

    Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...

  9. 【LSGDOJ 1333】任务安排 dp

    题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti.在每批任务开始 ...

  10. HTML的基本介绍

    HTML(HyperText Markup Language): 超文本标记语言,超文本就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素. HTML是标记语言!!!!! HTML是标记语言! ...