Blob介绍
BLOB类型的字段用于存储二进制数据
MySQL中,BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同。
MySQL的四种BLOB类型
类型 大小(单位:字节)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G
Oracle LOB介绍
LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。
LOB 分为两种类型:内部LOB和外部LOB。
内部LOB将数据以字节流的形式存储在数据库的内部。因而,内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作。Oracle支持三种类型的内部LOB:
- BLOB(二进制数据)
- CLOB(单字节字符数据)
- NCLOB(多字节字符数据)。
CLOB和NCLOB类型适用于存储超长的文本数据,BLOB字段适用于存储大量的二进制数据,如图像、视频、音频,文件等。
目前只支持一种外部LOB类型,即BFILE类型。在数据库内,该类型仅存储数据在操作系统中的位置信息,而数据的实体以外部文件的形式存在于操作系统的文件系统中。因而,该类型所表示的数据是只读的,不参与事务。该类型可帮助用户管理大量的由外部程序访问的文件。
程序示例:
package tan
;
import java
. io
.*;
import java
. sql
.*;
import java
. text
. SimpleDateFormat
;
import org
. junit
. Test
;
public class TestJDBC
{
//如何获取数据表中的 blob类型的变量
@Test
public void testBlob2
()
{
Connection conn
=
null
;
PreparedStatement ps
=
null
;
ResultSet rs
=
null
;
InputStream is
=
null
;
FileOutputStream fos
=
null
;
try
{
conn
= JDBCUtils
. getConnection
();
String sql
= "select id,name,email,birth,photo from customers where id=?"
;
ps
= conn
. prepareStatement
( sql
);
ps
.setInt
(1
, 16
);//获取id=16的数据
rs
= ps
. executeQuery
();
if
( rs
. next
()){
int id
= rs
. getInt
( 1
);
String name
= rs
. getString
( 2
);
String email
= rs
. getString
( 3
);
Date birth
= rs
. getDate
( 4
);
Blob photo
=rs
.getBlob
(5
);
is
= photo
. getBinaryStream
();//利用输入流来读取数据库中的二进制文件
fos
=
new FileOutputStream
(
new File
( "girl.png"
));//输出到本地
byte
[] buf
=
new byte
[ 100
];
int len
= 0
;
while
(( len
= is
. read
( buf
))!=- 1
){
fos
. write
( buf
, 0
, len
);
}
Customer cust
=
new Customer
( id
, name
, email
, birth
);//将非blob类型封装成对象输出
System
. out
. println
( cust
);
}
}
catch
( Exception e
)
{
}
finally
{
JDBCUtils
. close
( rs
, ps
, conn
);//记得要关闭流
if
( fos
!=
null
){
try
{
fos
. close
();
}
catch
( IOException e
)
{
e
. printStackTrace
();
}
}
if
( is
!=
null
){
try
{
is
. close
();
}
catch
( IOException e
)
{
// TODO Auto-generated catch block
e
. printStackTrace
();
}
}
}
}
// 修改数据表包含图片信息的数据
@Test
public void testBlob1
()
{
Connection conn
=
null
;
PreparedStatement ps
=
null
;
FileInputStream fis
=
null
;
try
{
conn
= JDBCUtils
. getConnection
();
String sql
= "update customers set photo = ? where id = ?"
;
ps
= conn
. prepareStatement
( sql
);
// 填充占位符
fis
=
new FileInputStream
(
new File
( "1.png"
));
ps
.setBlob
(1
, fis
);
ps
. setInt
( 2
, 16
);
ps
.execute
();
}
catch
( Exception e
)
{
e
. printStackTrace
();
}
finally
{
JDBCUtils
. close
(
null
,
ps
, conn
);
try
{
fis
. close
();
}
catch
( IOException e
)
{
e
. printStackTrace
();
}
}
}
// 向数据表中插入一条包含图片信息的数据
@Test
public void testBlob
()
{
Connection conn
=
null
;
PreparedStatement ps
=
null
;
FileInputStream fis
=
null
;
try
{
conn
= JDBCUtils
. getConnection
();
String sql
= "insert into customers(name,email,birth,photo)values(?,?,?,?)"
;
ps
= conn
. prepareStatement
( sql
);
ps
. setString
( 1
, " zhengqiang "
);
ps
. setString
( 2
, "beipiao@123.com"
);
// 日期转换
String date
= "1991-11-13"
;
SimpleDateFormat sdf
=
new SimpleDateFormat
( "yyyy-MM-dd"
);
java
. util
. Date d
= sdf
. parse
( date
);
ps
. setDate
( 3
,
new Date
( d
. getTime
()));
//利用文件输入流写入
fis
=
new FileInputStream
(
new File
( "66.jpg"
));
ps
. setBlob
( 4
, fis
);
// 执行预编译语句
ps
.execute
();
}
catch
( Exception e
)
{
e
. printStackTrace
();
}
finally
{
JDBCUtils
. close
(
null
,
ps
, conn
);
try
{
fis
. close
();
}
catch
( IOException e
)
{
e
. printStackTrace
();
}
}
}
}