使用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:
  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类型的数据的更多相关文章

  1. 向Oracle 数据表中插入一条带有日期类型的数据

    有一张表:batch(批次表) 表的字段如下: 第一种情况: 现在需要插入一条当前的系统时间 sql 如下: insert into batch (batch_id, cus_id, batch_nu ...

  2. 向mysql数据表中插入数据失败的原因

    1.案例代码: $sql1="insert into content(category,subject,content,username,release_date) values('{$ca ...

  3. 触发器修改后保存之前的数据 表中插入数据时ID自动增长

    create or replace trigger t before update on test5 for each rowbegin insert into test55 values (:old ...

  4. sql 所有数据表中 插入字段

    declare @tablename varchar(200)declare @sql varchar(2000)declare cur_t cursor forselect name from sy ...

  5. MySQL 向表中插入、删除数据

    一.向表中插入一条信息 1.查看表中的数据 mysql> SELECT * FROM user; +----+---------+----------+ | id | account | pas ...

  6. Mysql如何向存在外键的数据表中插入数据

    1.创建表 CREATE TABLE `trn_comment_msg` ( `comMsgId` ) NOT NULL AUTO_INCREMENT COMMENT '评论消息主键', `msgId ...

  7. mysql 数据表中查找、删除重复记录

    为了性能考虑,在阅读之前提醒大家,如果有子查询,子查询查询到的数据最好不要超过总数据量的30%. 查询有重复数据的记录 select * from F group by a,b,c,d having ...

  8. Yii1 用commandBuilder方法往数据表中插入多条记录

    $builder = Yii::app()->db->schema->commandBuilder; // 创建builder对象 $command = $builder->c ...

  9. MySQL查询数据表中数据记录(包括多表查询)

    MySQL查询数据表中数据记录(包括多表查询) 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: sele ...

随机推荐

  1. Android Gradle 依赖方式

    Android Gradle 依赖方式有以下6种: Compile compile是对所有的build type以及favlors都会参与编译并且打包到最终的apk文件中. Provided Prov ...

  2. Scrapy实战篇(四)爬取京东商城文胸信息

    创建scrapy项目 scrapy startproject jingdong 填充 item.py文件 在这里定义想要存储的字段信息 import scrapy class JingdongItem ...

  3. POJ1569 Myacm Triangles

    Description There has been considerable archeological work on the ancient Myacm culture. Many artifa ...

  4. php解析excel文件

    public static function getStaffByXlsx($path) { /*dirname(__file__): 当前代码所在的目录,$path: ”/文件名“ */ $PHPR ...

  5. python 的序列化和反序列化

    什么是序列化?简单来说就是将数据存储到物理内存上的过程叫序列化. 什么是反序列化?将数据从物理内存存储到程序内存的过程叫做反序列化. 下面来看一下python中使用json进行序列化和反序列化的实例d ...

  6. hive的使用

    1,前言 书接上回,接着对上一个hive安装后环境下的hive使用.

  7. VS2010 永久配置OpenCv2.4.9 及转换到COFF 期间失败:文件无效或损坏,解决方法

    1.下载OpenCv2.4.9(win pack):http://opencv.org/releases.html 下载完成后,进行解压(win7 64位系统) 2.环境配置,配置如下图所示: 找到p ...

  8. Java 身份证判断性别获取年龄

    import com.alibaba.fastjson.JSON; import org.junit.Test; import java.text.SimpleDateFormat; import j ...

  9. Spring利用注解@Value获取properties属性为null

    今天在项目中想使用@Value来获取Springboot中properties中属性值. 场景:定义了一个工具类,想要获取一些配置参数,使用了@value来获取,但是死活也获取不到. 如何解决:在使用 ...

  10. pyqt---------事件与信号处理

    pyqt:信号与槽的关系 GUI应用程序是事件驱动的. 事件主要由应用程序的用户生成. 但它们也可以通过其他手段产生,例如:网络连接,窗口管理器或定时器. 当我们调用应用程序的exec_()方法时,应 ...