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, "[email protected]" );
//日期转换
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 ();
}
}
}
}