数据库存取BLOB类型音乐文件的过程及常见错误

数据库存取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.获取数据库连接对象Connection
		java.sql.Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_jdbc","root", "root");
		
		//4.定义sql
		String sql = "insert into mymusic  values(?,?)";
		
		//5.获取执行sql语句的对象Statement
		PreparedStatement 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;
    将数据库存取的最大容量改为8M
  • show 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.获取数据库连接对象Connection
		java.sql.Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_jdbc","root", "root");
		
		//4.定义sql
		String sql = "select music from mymusic where id = ? ";
		
		//5.获取执行sql语句的对象Statement
		PreparedStatement 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);
			}
			//流操作要close
			out.close();
			in.close();
		}
		//8.释放资源
		rs.close();
		pst.close();
		conn.close();
	}
}

运行后,进行刷新,完成音乐文件的读取
在这里插入图片描述

在这里插入图片描述

播放成功

在这里插入图片描述

如果觉得这篇博客对你有些用处,希望支持一下啦!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值