黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\

大数据

目标:把
mp3
保存到数据库中!


my.ini
中添加如下配置!

max_allowed_packet=10485760

1
什么是大数据

所谓大数据,就是大的字节数据,或大的字符数据。标准
SQL
中提供了如下类型来保存大数据类型:

类型

长度

tinyblob

2
8-
-1B

256B

blob

2
16
-1B

64K

mediumblob

2
24
-1B

16M

longblob

2
32
-1B

4G

tinyclob

2
8-
-1B

256B

clob

2
16
-1B

64K

mediumclob

2
24
-1B

16M

longclob

2
32
-1B

4G

但是,在
mysql
中没有提供
tinyclob

clob

mediumclob

longclob
四种类型,而是使用如下四种类型来处理文本大数据:

类型

长度

tinytext

2
8-
-1B

256B

text

2
16
-1B

64K

mediumtext

2
24
-1B

16M

longtext

2
32
-1B

4G

首先我们需要创建一张表,表中要有一个
mediumblob

16M
)类型的字段。

CREATE TABLE tab_bin(

id INT PRIMARY KEY AUTO_INCREMENT,

filenameVARCHAR(
100),

data MEDIUMBLOB

);

向数据库插入二进制数据需要使用
PreparedStatement
为原
setBinaryStream(int, InputSteam)
方法来完成。

con = JdbcUtils.
getConnection
();

String sql = "insert into tab_bin(filename,data) values(?, ?)";

pstmt = con.prepareStatement(sql);

pstmt.setString(1, "a.jpg");

InputStream in =
new
FileInputStream("f:\\a.jpg");

pstmt.setBinaryStream(2, in);

pstmt.executeUpdate();

读取二进制数据,需要在查询后使用
ResultSet
类的
getBinaryStream()
方法来获取输入流对象。也就是说,
PreparedStatement

setXXX()
,那么
ResultSet
就有
getXXX()

con = JdbcUtils.
getConnection
();

String sql = "select filename,data from tab_bin where id=?";

pstmt = con.prepareStatement(sql);

pstmt.setInt(1, 1);

rs = pstmt.executeQuery();

rs.next();

String filename = rs.getString("filename");

OutputStream out =
new
FileOutputStream("F:\\" + filename);

InputStream in = rs.getBinaryStream("data");

IOUtils.
copy
(in, out);

out.close();

还有一种方法,就是把要存储的数据包装成
Blob
类型,然后调用
PreparedStatement

setBlob()
方法来设置数据

con = JdbcUtils.
getConnection
();

String sql = "insert into tab_bin(filename,data) values(?, ?)";

pstmt = con.prepareStatement(sql);

pstmt.setString(1, "a.jpg");

File file =
new
File("f:\\a.jpg");

byte
[] datas = FileUtils.
getBytes
(file);//
获取文件中的数据

Blob blob =
new
SerialBlob(datas);//
创建
Blob
对象

pstmt.setBlob(2, blob);//
设置
Blob
类型的参数

pstmt.executeUpdate();

con = JdbcUtils.
getConnection
();

String sql = "select filename,data from tab_bin where id=?";

pstmt = con.prepareStatement(sql);

pstmt.setInt(1, 1);

rs = pstmt.executeQuery();

rs.next();

String filename = rs.getString("filename");

File file =
new
File("F:\\" + filename) ;

Blob blob = rs.getBlob("data");

byte
[] datas = blob.getBytes(0, (
int
)file.length());

FileUtils.
writeByteArrayToFile
(file, datas);

上课老师敲的代码:

packagecn.itcast.demo4;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.sql.Blob;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjavax.sql.rowset.serial.SerialBlob;importorg.apache.commons.io.IOUtils;importorg.junit.Test;importcn.itcast.demo3.JdbcUtils;/*** 大数据
*
@authorcxf
*
*/ public classDemo4 {/*** 把mp3保存到数据库中。
*
@throwsSQLException
*
@throwsIOException
*
@throwsFileNotFoundException*/@Testpublic void fun1() throwsException {/** 1. 得到Connection
* 2. 给出sql模板,创建pstmt
* 3. 设置sql模板中的参数
* 4. 调用pstmt的executeUpdate()执行
*/Connection con=JdbcUtils.getConnection();
String sql
= "insert into tab_bin values(?,?,?)";
PreparedStatement pstmt
=con.prepareStatement(sql);

pstmt.setInt(
1, 1);
pstmt.setString(
2, "流光飞舞.mp3");/*** 需要得到Blob
* 1. 我们有的是文件,目标是Blob
* 2. 先把文件变成byte[]
* 3. 再使用byte[]创建Blob
*/ //把文件转换成byte[] byte[] bytes = IOUtils.toByteArray(new FileInputStream("F:/流光飞舞.mp3"));//使用byte[]创建Blob Blob blob = newSerialBlob(bytes);//设置参数 pstmt.setBlob(3, blob);

pstmt.executeUpdate();
}
/*** 从数据库读取mp3
*
@throwsSQLException*/@Testpublic void fun2() throwsException {/** 1. 创建Connection*/Connection con=JdbcUtils.getConnection();/** 2. 给出select语句模板,创建pstmt*/String sql= "select * from tab_bin";
PreparedStatement pstmt
=con.prepareStatement(sql);/** 3. pstmt执行查询,得到ResultSet*/ResultSet rs=pstmt.executeQuery();/** 4. 获取rs中名为data的列数据*/ if(rs.next()) {
Blob blob
= rs.getBlob("data");/** 把Blob变成硬盘上的文件!*/ /** 1. 通过Blob得到输入流对象
* 2. 自己创建输出流对象
* 3. 把输入流的数据写入到输出流中
*/InputStream in=blob.getBinaryStream();
OutputStream out
= new FileOutputStream("c:/lgfw.mp3");
IOUtils.copy(in, out);
}
}
}

标签: none

添加新评论