数据库大文本数据处理 目标:把 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, filename VARCHAR(100), data MEDIUMBLOB ); 还有一种方法,就是把要存储的数据包装成Blob类型,然后调用PreparedStatement的setBlob()方法来设置数据 代码如下: package cn.itcast.demo4; 主要的包 import java.sql.Blob; import javax.sql.rowset.serial.SerialBlob; import org.apache.commons.io.IOUtils; import cn.itcast.demo3.JdbcUtils; /** * 大文本数据 */ public class Demo4 { // 把mp3保存到数据库中。 @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 */ @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); } } }