首页 > 代码库 > 使用PreparedStatement向数据表中插入、修改、删除、获取Blob类型的数据

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

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:
  1. BLOB(二进制数据)  
  2. CLOB(单字节字符数据) 
  3. 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 ();
             }
         }
        
    }
    
}

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