使用PreparedStatement向数据表中插入、修改、删除、获取Blob类型的数据
2014-09-07 20:17
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(多字节字符数据)。
目前只支持一种外部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 ();
}
}
}
}