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

fos .write (buf ,0, len);

}

Customer cust =new Customer (id , name , email, birth);//将非blob类型封装成对象输出

System .out .println (cust );

}

} catch (Exception
) {

}finally{

JDBCUtils .close (rs , ps , conn );//记得要关闭流

if(fos != null){

try {

fos .close ();

} catch (IOException
) {

.printStackTrace ();

}

}

if(is != null){

try {

is .close ();

} catch (IOException
) {

// TODO Auto-generated
catch block

.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
) {

.printStackTrace ();

}finally{

JDBCUtils .close (null, ps, conn);

try {

fis .close ();

} catch (IOException
) {

.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, "[email protected]" );

//日期转换

String date ="1991-11-13";

SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");

java .util .Date
=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
) {

.printStackTrace ();

}finally{

JDBCUtils .close (null, ps, conn);

            try {

fis .close ();

} catch (IOException
) {

.printStackTrace ();

}

}

}

}

时间: 2024-10-12 22:32:48

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

Sql Server 在已知表中插入、删除、修改某一列操作

--1.向已有表中增加一列 ALTER TABLE TableName ADD ColumnName VARCHAR(20) NULL --2.删除表中的某一列 ALTER TABLE TableName DROP COLUMN ColumnName --3.修改某一列的数据类型 ALTER TABLE TableName ALTER COLUMN ColumnName INT 2.查询当年或者当月的数据 1.查询当年的数据 SELECT * FROM UserInfo WHERE YEAR(R

通过 JDBC 向指定的数据表中插入一条记录,查询记录

//通过 JDBC 向指定的数据表中插入一条记录 /*  * 1.Statement: 用于执行SQl语句的对象  *  通过Connection 的createStatement()方法来获取  *  通过executeUptate(sql) 可执行sql语句  *  传入的sql 可以是 insert , update, delete 但不能是select  * 2.Connection 和 Statement 需要关闭  *  需要在finally中关闭  * 3.关闭的顺序:先关闭后获取

sql 所有数据表中 插入字段

declare @tablename varchar(200)declare @sql varchar(2000)declare cur_t cursor forselect name from sysobjects where xtype= 'U ' and status> =0 and name not in (select name from sysobjects where id in (select id from syscolumns where id in (select id f

2014.11.26 向MySQL数据表中插入数据时,显示“syntax error”时应检查

插入语句: "insert into tablename (a,b,c,d) values(1,2,3,4)" 插入结果: a b c d 1 2 3 4 有误时,请检查: 1.名值对有没有写错: 2.代码的字符串处理有没有问题: 3.代码中的列名和表中的列名是不是一一对应的: 4.定义的列名是否跟SQL语句中的关键字重复,例如dec等.

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

MySQL查询数据表中数据记录(包括多表查询) MySQL查询数据表中数据记录(包括多表查询) 转自:http://www.baike369.com/content/?id=5355 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: select selection_list // 要查询的内容,选择哪些列 from table_list // 从什么表中查询,从何处选择行 where primary_

Hive通过查询语句向表中插入数据过程中发现的坑

前言 最近在学习使用Hive(版本0.13.1)的过程中,发现了一些坑,它们或许是Hive提倡的比关系数据库更加自由的体现(同时引来一些问题),或许是一些bug.总而言之,这些都需要使用Hive的开发人员额外注意.本文旨在列举我发现的2个通过查询语句向表中插入数据过程中的问题,希望大家注意. 数据准备 为了验证接下来出现的问题,需要先准备两张表employees和staged_employees,并准备好测试数据.首先使用以下语句创建表employees: create table employ

mysql5.7基础 向指定数据库的指定表中插入符合要求的数据

镇场文:       学儒家经世致用,行佛家普度众生,修道家全生保真,悟易理象数通变.以科技光耀善法,成就一良心博客.______________________________________________________________________________________________________ Operating System:UbuntuKylin 16.04 LTS 64bitmysql: Ver 14.14 Distrib 5.7.17, for Linux (

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform)让用户方便的操作数据库中的数据. 什么是ADO.NET 是一组库类,System.Data. Ado.net组成 Connection:用来连接数据库 Command:用来执行SQL语句 DataReader:只读.只进的结果集,一条一条读取数据(SteamReader.XmlReader) Da

建立触发器后,不能像表中插入数据,是什么原因

建立触发器后,不能像表中插入数据,是什么原 USE [cai2016]GO/****** Object:  Trigger [dbo].[trigger_yunum]    Script Date: 2017/3/29 17:30:30 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOalter trigger [dbo].[trigger_yunum] on [dbo].[newmoo_case_cgxd]   for  insert a