数据库存取BLOB类型音乐文件的过程及常见错误
数据库端的准备工作:
新建表,用来存放音乐文件:mymusic
第一列:id 类型:int
第二列:music 类型:blob
将音乐文件存入数据库
/*** */
package cn.zxm.jsp;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;/*** @author Miao**/
public class JDBCBlobTest {//通过JDBC存储二进制类型(音乐)//BLOB//存入音乐的内容//1.先通过 pst 的 ? 代替音乐内容//2.在通过 pst.setBinaryStream(2, in, (int)file.length());将上一步的? 代替成 二进制数据流 public static void main(String[] args) throws Exception {//1.注册驱动Class.forName("com.mysql.jdbc.Driver");//反射//3.获取数据库连接对象Connectionjava.sql.Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_jdbc","root", "root");//4.定义sqlString sql = "insert into mymusic values(?,?)";//5.获取执行sql语句的对象StatementPreparedStatement pst = conn.prepareStatement(sql);pst.setInt(1, 1);//InputStreamReader转换流可以设置编码File file = new File("D:\\goodbye.mp3");//设置BLOB类型,setBinaryStream//字节流InputStream in = new FileInputStream(file);pst.setBinaryStream(2, in, (int)file.length());//执行sql,接受返回结果int count = pst.executeUpdate();//处理结果System.out.println("受影响行数:"+ count);//释放资源in.close();pst.close();conn.close();}
}
JDBCBlobTest.java运行时出现的错误:
** 1. 这里显示我存的数据超过了数据库存取的最大容量:这里需要修改MySQL数据库的最大容量
解决方法:**
SET GLOBAL max_allowed_packet=8*1024*1024;
将数据库存取的最大容量改为8Mshow VARIABLES like '%max_allowed_packet%';
查看数据库存取的最大容量
问题解决!!
2. 使用BLOB类型进行数据存储,BLOB存储空间不够
解决完第一个问题后,又出现新的错误,虽然英文不好,但是"Data too long"还是知道的,类型明明是BLOB类型了,怎么存储空间还不够4M吗?然后把错误去百度一搜,发现解决办法都是关于编码的问题,但是音乐文件以二进制形式存取和编码没有关系。于是就想,BLOB不够4M,还有没有其他的比BLOB更大的数据类型,就去Navicat找更高大上的类型,结果,真的有
后来,查了一下BLOB的最大存储大小:
TinyBlob:255B
Blob:65K
MediumBlob:16M
LongBlob:4G
最后,程序成功运行了
控制台:
数据库:
将音乐文件从数据库中取出:
/*** */
package cn.tx.jsp;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;/*** @author 11441**/
public class JDBCBlobReader {//取出音乐的内容public static void main(String[] args) throws Exception {//1.注册驱动Class.forName("com.mysql.jdbc.Driver");//反射//3.获取数据库连接对象Connectionjava.sql.Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_jdbc","root", "root");//4.定义sqlString sql = "select music from mymusic where id = ? ";//5.获取执行sql语句的对象StatementPreparedStatement pst = conn.prepareStatement(sql);pst.setInt(1, 1);ResultSet rs = pst.executeQuery();//读取if(rs.next()) {InputStream in = rs.getBinaryStream("music");//通过io流输出//读到哪里OutputStream out = new FileOutputStream("src/music.mp3");byte[] chs = new byte[100];int len = -1;while( (len = in.read(chs)) != -1 ) {//输出,从0开始输出,长度为数组的字长out.write(chs , 0 ,chs.length);}//流操作要closeout.close();in.close();}//8.释放资源rs.close();pst.close();conn.close();}
}
运行后,进行刷新,完成音乐文件的读取
播放成功
如果觉得这篇博客对你有些用处,希望支持一下啦!!