使用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
))!=-
){
                    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. FastCGI点滴

    FastCGI是一种二进制协议,用于将交互式程序与Web服务器连接.它是早期通用网关接口(CGI)的变体.FastCGI的主要目标是减少与Web服务器和CGI程序之间的接口相关的开销,允许服务器每单位 ...

  2. VS 代码片段集

    片段1:用于线程执行代码,耗时操作时加载Loging; <?xml version="1.0" encoding="utf-8"?> <Cod ...

  3. 学习:D3

    http://www.ourd3js.com/wordpress/?p=196 http://www.ourd3js.com/demo/rm/R-9.2/force.html 力导向图(那个可以拖拽的 ...

  4. html: 仿制soundmanager2右上角面板

    仿制 http://schillmania.com/projects/soundmanager2/#volume 右上角面板 <style type="text/css"&g ...

  5. How to solve “Dynamic Web Module 3.1 requires Java 1.7 or newer” in Eclipse

    How to solve “Dynamic Web Module 3.1 requires Java 1.7 or newer” in Eclipse Last updated on June 20t ...

  6. 三. html&JavaScript&ajax 部 分

    1. 判 断 第 二 个 日 期 比 第 一 个 日 期 大 如何用脚本判断用户输入的的字符串是下面的时间格式2004-11-21必须要保证用户 的输入是此格式,并且是时间,比如说月份不大于12等等, ...

  7. Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的,其内部是怎么实现的

    其实也就是通过接口名与mapper的id绑定在一起(即相同),通过SQL去写实现类,返回数据.

  8. STL里的内存池实现

    这个貌似有点复杂,解决的主要问题 就是 减少 内存分配次数,减少用户态核心态切换中断次数,提高运行速度,预分配 和线程池一个道理,预分配 ////////////////////自由链表 union ...

  9. spring的ioc与aop原理

    ioc(反向控制) 原理:    在编码阶段,既没有实例化对象,也没有设置依赖关系,而把它交给Spring,由Spring在运行阶段实例化.组装对象.这种做法颠覆了传统的写代码实例化.组装对象.然后一 ...

  10. npm突然找不到D:\nodejs\node_modules\npm\bin\npm-cli.js的解决方法

    我在安装iView的时候就突然出现这个不正常工作,之后无论用npm进行任何操作,都会出现如下错误 真的是让人很着急啊,看了看环境配置,没问题,然后根据路径找错误,也不知道是哪里出了坑,上百度查,最多建 ...