使用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. python configparser使用

    .ini文件由若干section(部分)组成, 而每一个section又由若干键值对组成. 以 example.ini为例: [DEFAULT] ServerAliveInterval = 45 Co ...

  2. JAVA web端JS下载excel文件

    JSP代码如下: JSP端引入jquery.easyui.min.js库: <script type="text/javascript" src="<c:ur ...

  3. winfrom

    WINFORM(winform) windows窗体应用程序(.NET Framework4,版本太高了不好,选中Visual c#) 客户端应用程序的特点是:所见即所得,就是说,编辑的什么样,启动之 ...

  4. javascript常用工具类整理(copy)

    JavaScript常用工具类 类型 日期 数组 字符串 数字 网络请求 节点 存储 其他 1.类型 isString (o) { //是否字符串 return Object.prototype.to ...

  5. 24种java设计模式总结和目录

    https://blog.csdn.net/qq_40369829/article/details/80374131 简介原则分类创建型模式结构型模式行为型模式类图参考简介设计模式是在特定环境下,为解 ...

  6. docker命令相关

    进入容器 容器已经启动 docker exec -it ece7b58a2a04 /bin/sh 容器未启动 docker run -it zzzzz/edas:v1 sh 检查容器 docker i ...

  7. 代码: !AJAX

    http://www.cnblogs.com/cwp-bg/p/7668840.html ajax和jsonp使用总结 2017-10-17 var requestUrl="http://l ...

  8. c# post 接收传来的文件

    private void UploadFile() { // //......其他代码 // HttpFileCollection files = HttpContext.Current.Reques ...

  9. java书籍

    1.«java高并发编程详解 »一本比较详细介绍多线程的书籍,个人感觉比 并发编程思想 这本书详细

  10. [Ting's笔记Day7]活用套件carrierwave gem:(2)利用Amazon S3架设图片服务器

    来到第7篇了!培养写作习惯真是不容易:) 在我的上一篇文章活用套件carrierwave gem:(1)在Rails实现图片上传功能,上传图片功能已经完成啦!但是目前图片仅能上传在自己的本地文件夹内孤 ...