大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17
黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\
大数据
目标:把
mp3
保存到数据库中!
在
my.ini
中添加如下配置!
max_allowed_packet=10485760
1
什么是大数据
所谓大数据,就是大的字节数据,或大的字符数据。标准
SQL
中提供了如下类型来保存大数据类型:
类型 |
长度 |
tinyblob |
2 |
blob |
2 |
mediumblob |
2 |
longblob |
2 |
tinyclob |
2 |
clob |
2 |
mediumclob |
2 |
longclob |
2 |
但是,在
mysql
中没有提供
tinyclob
、
clob
、
mediumclob
、
longclob
四种类型,而是使用如下四种类型来处理文本大数据:
类型 |
长度 |
tinytext |
2 |
text |
2 |
mediumtext |
2 |
longtext |
2 |
首先我们需要创建一张表,表中要有一个
mediumblob
(
16M
)类型的字段。
CREATE TABLE tab_bin(
id INT PRIMARY KEY AUTO_INCREMENT,
filenameVARCHAR(100),
data MEDIUMBLOB
);
向数据库插入二进制数据需要使用
PreparedStatement
为原
setBinaryStream(int, InputSteam)
方法来完成。
con = JdbcUtils. String sql = "insert into tab_bin(filename,data) values(?, ?)"; pstmt = con.prepareStatement(sql); pstmt.setString(1, "a.jpg"); InputStream in = pstmt.setBinaryStream(2, in); pstmt.executeUpdate(); |
读取二进制数据,需要在查询后使用
ResultSet
类的
getBinaryStream()
方法来获取输入流对象。也就是说,
PreparedStatement
有
setXXX()
,那么
ResultSet
就有
getXXX()
。
con = JdbcUtils. 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 = InputStream in = rs.getBinaryStream("data"); IOUtils. out.close(); |
还有一种方法,就是把要存储的数据包装成
Blob
类型,然后调用
PreparedStatement
的
setBlob()
方法来设置数据
con = JdbcUtils. String sql = "insert into tab_bin(filename,data) values(?, ?)"; pstmt = con.prepareStatement(sql); pstmt.setString(1, "a.jpg"); File file = byte Blob blob = pstmt.setBlob(2, blob);// pstmt.executeUpdate(); |
con = JdbcUtils. 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 = Blob blob = rs.getBlob("data"); byte FileUtils. |
上课老师敲的代码:
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);
}
}
}