使用PreparedStatement向数据表中插入、修改、删除、获取Blob类型的数据

2023-06-25,,

使用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(多字节字符数据)。

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
))!=-
){

                    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 
();

             
}

         
}

        

    
}

    

}

使用PreparedStatement向数据表中插入、修改、删除、获取Blob类型的数据的相关教程结束。

《使用PreparedStatement向数据表中插入、修改、删除、获取Blob类型的数据.doc》

下载本文的Word格式文档,以方便收藏与打印。