BLOB/ClOB存储图片、文档与视频

简介: BLOB/ClOB存储图片、文档与视频

【1】Oracle LOB

LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。



LOB 分为两种类型:内部LOB和外部LOB。

内部LOB将数据以字节流的形式存储在数据库的内部。因而,内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作。Oracle支持三种类型的内部LOB:

BLOB(二进制数据)  
CLOB(单字节字符数据) 
NCLOB(多字节字符数据)。



CLOB和NCLOB类型适用于存储超长的文本数据,BLOB字段适用于存储大量的二进制数据,如图像、视频、音频,文件等。


目前只支持一种外部LOB类型,即BFILE类型。在数据库内,该类型仅存储数据在操作系统中的位置信息,而数据的实体以外部文件的形式存在于操作系统的文件系统中。因而,该类型所表示的数据是只读的,不参与事务。该类型可帮助用户管理大量的由外部程序访问的文件。


**使用JDBC来写入Blob型数据到Oracle中 **


Oracle的Blob字段比long字段的性能要好,可以用来保存如图片之类的二进制数据。


Oracle的BLOB字段由两部分组成:数据(值)和指向数据的指针(定位器)。


尽管值与表自身一起存储,但是一个BLOB列并不包含值,仅有它的定位指针。为了使用大对象,程序必须声明定位器类型的本地变量。


当Oracle内部LOB被创建时,定位器被存放在列中,值被存放在LOB段中,LOB段是在数据库内部表的一部分。


因为Blob自身有一个cursor,当写入Blob字段必须使用指针(定位器)对Blob进行操作,因而在写入Blob之前,必须获得指针(定位器)才能进行写入。


如何获得Blob的指针(定位器) :需要先插入一个empty的blob,这将创建一个blob的指针,然后再把这个empty的blob的指针查询出来,这样通过两步操作,就获得了blob的指针,可以真正的写入blob数据了。


步骤:

1、插入空blob

insert into javatest(name,content) values(?,empty_blob());



2、获得blob的cursor

select content from javatest where name= ? for update;
• 1

注意: 须加for update,锁定该行,直至该行被修改完毕,保证不产生并发冲突。



3、利用 io,和获取到的cursor往数据库写数据流


【2】MySQL BLOB


MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。

MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)。

类型 大小(字节)
TinyBlob 255
Blob 65K
MediumBlob 16M
LongBlob 4G



实际使用中根据需要存入的数据大小定义不同的BLOB类型。需要注意的是:如果存储的文件过大,数据库的性能会下降。


【3】BLOB–二进制数据

第一种方式:


存:psmt.setBinaryStream(3,fis,(int)f.length());


3:第三列,fis:从文件获取的输入流,f:文件对象;


读:InputStream is = ResultSet.getBinaryStream(3);

拿到输入流之后,就可以进行任意操作。

第二种方式:

setBlob()/getBlob()


读取操作实例代码如下:

//获得数据库连接    
  Connection con = ConnectionFactory.getConnection();    
  con.setAutoCommit(false);    
  Statement st = con.createStatement();    
  //不需要“for update”    
  ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");    
  if (rs.next())    
  {    
    java.sql.Blob blob = rs.getBlob("BLOBATTR");    
    InputStream inStream = blob.getBinaryStream();    
    //data是读出并需要返回的数据,类型是byte[]    
    data = new byte[input.available()];    
    inStream.read(data);    
    inStream.close();    
  }    
  inStream.close();    
  con.commit();    
  con.close();

写入操作实例代码如下:

//获得数据库连接    
  Connection con = ConnectionFactory.getConnection();    
  con.setAutoCommit(false);    
  Statement st = con.createStatement();    
  //插入一个空对象empty_blob()    
  st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");    
  //锁定数据行进行更新,注意“for update”语句    
  ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");    
  if (rs.next())    
  {    
    //得到java.sql.Blob对象后强制转换为oracle.sql.BLOB   
    oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");    
    OutputStream outStream = blob.getBinaryOutputStream();    
    //data是传入的byte数组,定义:byte[] data   
    outStream.write(data, 0, data.length);    
  }    
  outStream.flush();    
  outStream.close();    
  con.commit();    
  con.close();  


【4】CLOB–字符文件

第一种方式:

存:psmt.setAsciiStream(3,fis,(int)f.length());


3:第三列,fis:从文件获取的输入流,f:文件对象;

读:InputStream is = ResultSet.getAsciiStream(3);

拿到输入流之后,就可以进行任意操作。



第二种方式:

setClob()/getClob()


读取操作实例代码如下:

  //获得数据库连接    
  Connection con = ConnectionFactory.getConnection();    
  con.setAutoCommit(false);    
  Statement st = con.createStatement();    
  //不需要“for update”    
  ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");    
  if (rs.next())    
  {    
    java.sql.Clob clob = rs.getClob("CLOBATTR");    
    Reader inStream = clob.getCharacterStream();    
    char[] c = new char[(int) clob.length()];    
    inStream.read(c);    
    //data是读出并需要返回的数据,类型是String    
    data = new String(c);    
    inStream.close();    
  }    
  inStream.close();    
  con.commit();    
  con.close();  



写入操作实例代码如下:

  //获得数据库连接    
  Connection con = ConnectionFactory.getConnection();    
  con.setAutoCommit(false);    
  Statement st = con.createStatement();    
  //插入一个空对象empty_clob()    
  st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");    
  //锁定数据行进行更新,注意“for update”语句    
  ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");    
  if (rs.next())    
  {    
    //得到java.sql.Clob对象后强制转换为oracle.sql.CLOB   
    oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");    
    Writer outStream = clob.getCharacterOutputStream();    
    //data是传入的字符串,定义:String data    
    char[] c = data.toCharArray();    
    outStream.write(c, 0, c.length);    
  }    
  outStream.flush();    
  outStream.close();    
  con.commit();    
  con.close()


目录
相关文章
|
8月前
|
前端开发
42 # 前端 blob 类型
42 # 前端 blob 类型
41 0
|
前端开发 API
图片或文件Blob、File、Base64之间的相互转换
在做前端项目的时候,遇到图片的上传或者下载时,不可避免的会遇到Blob、File、Base64三种类型的转换。那么今天就总结下,三者之间的相互转换。 首先我们看看base64 ,File 对象,Blob 对象长什么样的,怎么来的。
383 1
|
6月前
blob和base64互转
blob和base64互转
85 0
|
11月前
|
存储 关系型数据库 MySQL
浅谈Blob及使用场景
浅谈Blob及使用场景
231 0
|
12月前
|
存储 otter 关系型数据库
BLOB和VARBINARY类型的字段不能设置为NULL
BLOB和VARBINARY类型的字段不能设置为NULL
161 1
|
存储 关系型数据库 MySQL
jdbc之操作BLOB类型字段
jdbc之操作BLOB类型字段
jdbc之操作BLOB类型字段
|
存储 关系型数据库 MySQL
JDBC添加图片(Blob)类型的数据
学习记录:添加图片(Blob)类型的数据
|
SQL Java 数据库连接
|
存储 SQL Oracle
数据库中存媒体文件的字段用什么类型?一文带你了解二进制大对象BLOB
在大数据环境中,BLOB 很常见,并且存储在关系或非关系数据库系统中,描述的是一个二进制形式的大文件,一般可以是视频、音频或图像和图形文件。
392 0
数据库中存媒体文件的字段用什么类型?一文带你了解二进制大对象BLOB
|
存储 关系型数据库
postgre存储bytea类型(blob)
postgre存储bytea类型(blob)
719 0
postgre存储bytea类型(blob)