黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\
大数据
目标:把mp3保存到数据库中!
在my.ini中添加如下配置!
max_allowed_packet=10485760
1 什么是大数据
所谓大数据,就是大的字节数据,或大的字符数据。标准SQL中提供了如下类型来保存大数据类型:
类型 |
长度 |
tinyblob |
28--1B(256B) |
blob |
216-1B(64K) |
mediumblob |
224-1B(16M) |
longblob |
232-1B(4G) |
tinyclob |
28--1B(256B) |
clob |
216-1B(64K) |
mediumclob |
224-1B(16M) |
longclob |
232-1B(4G) |
但是,在mysql中没有提供tinyclob、clob、mediumclob、longclob四种类型,而是使用如下四种类型来处理文本大数据:
类型 |
长度 |
tinytext |
28--1B(256B) |
text |
216-1B(64K) |
mediumtext |
224-1B(16M) |
longtext |
232-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); |
上课老师敲的代码:
package cn.itcast.demo4; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.sql.Blob; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.rowset.serial.SerialBlob; import org.apache.commons.io.IOUtils; import org.junit.Test; import cn.itcast.demo3.JdbcUtils; /** * 大数据 * @author cxf * */ public class Demo4 { /** * 把mp3保存到数据库中。 * @throws SQLException * @throws IOException * @throws FileNotFoundException */ @Test public void fun1() throws Exception { /* * 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 = new SerialBlob(bytes); // 设置参数 pstmt.setBlob(3, blob); pstmt.executeUpdate(); } /** * 从数据库读取mp3 * @throws SQLException */ @Test public void fun2() throws Exception { /* * 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); } } }