前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java使用JDBC向数据库存取二进制数据(如图片,视频,音频等)

Java使用JDBC向数据库存取二进制数据(如图片,视频,音频等)

作者头像
害恶细君
发布2022-11-22 08:16:56
1.2K0
发布2022-11-22 08:16:56
举报
文章被收录于专栏:编程技术总结分享

前言

上次写了一个用JDBC向数据库存取小说等大文本的案例用到了PreparedStatement和io流的相关知识。Java使用JDBC向数据库存取大文本(比如小说等)

https://blog.csdn.net/weixin_50216991/article/details/120642592今天我又想起了数据库还可以存取图片,视频,音频等的二进制数据文件,按理来说说任何文件都可以存进数据库。其实和上一期的写法差不多啦,只是数据库存储数据的数据类型和io流不一样罢了,用到的是PreparedStatementsetBinaryStream()这个方法,而不是setCharacterStream()。我也借此机会顺便巩固一下jdbc和io流。

前提知识点

MySQL数据库有一个BLOB的数据类型,是一个可以存储二进制文件的容器,BLOB类型的文件可以是任何文件。 

MySQL有4种BLOB类型,如下:

类型

大小(单位:字节)

TinyBlob

最大 255k

Blob

最大 65K

MediumBlob

最大 16M

LongBlob

最大 4G

这里要测试存取音频或图片,我就用MediumBlob吧。

io流FileInputStream就行,其他都和上篇一样。

具体实现步骤

1.打开MySQL,并创建一个名为files的数据库,然后创建数据表。

 代码如下(示例):

代码语言:javascript
复制
create database files default character set = "utf8mb4";
代码语言:javascript
复制
create table myFile(
                       id int primary key ,
                       file mediumblob
);

2.将文件写入到数据库中myFile表的file字段。

创建普通Java项目,把MySQL的jdbc驱动的jar包下载后,导入到项目中,在src目录下创建一个WriteAndReadFile类,D盘根目录下有一个的音频萤火之森.mp3,假设我们就是要把它存入数据库中。然后编WriteAndReadFile类。这次的代码可能不会有那么多注释了,如果你不理解的话就去看我上一篇文章吧。

实现代码如下(示例):

代码语言:javascript
复制
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class WriteAndReadFile {
    //定义方法把文件写入MySQL数据库
    public static void writeFileToMySQL(){
        Connection conn=null;
        PreparedStatement ps=null;
        int result = 0;
        String dbDriver="com.mysql.cj.jdbc.Driver";
        String URL="jdbc:mysql://localhost:3306/files";
        String user="root";
        String pwd="zc20020106";
        try {
            Class.forName(dbDriver);
            conn=DriverManager.getConnection(URL,user,pwd);
            String sql="insert into myFile(id, file) values (?,?)";
            ps=conn.prepareStatement(sql);
            ps.setInt(1,1);
            File file =new File("D:\\idm_download\\萤火之森.mp3");
            //用FileInputStream来存文件
            InputStream in = new FileInputStream(file);
            ps.setBinaryStream(2,in,(int)file.length());
            result= ps.executeUpdate();
            in.close();
            if (result>0){
                System.out.println("音频文件写入成功!");
            }else {
                System.out.println("音频文件写入失败!");
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //释放资源
            if (ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        writeFileToMySQL();
    }


}

运行代码:

 3.读取数据库里的音频

思路:通过ResultSet的getBinaryStream()方法读取音频,然后通过io流写入到硬盘(src目录下)

代码如下:

代码语言:javascript
复制
import java.io.*;
import java.sql.*;



    public static void ReadFileToLocal(){
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        String dbDriver="com.mysql.cj.jdbc.Driver";
        String URL="jdbc:mysql://localhost:3306/files";
        String user="root";
        String pwd="zc20020106";
        try {
            Class.forName(dbDriver);
            conn=DriverManager.getConnection(URL,user,pwd);
            String sql="select * from myfile where id=?";
            ps=conn.prepareStatement(sql);
            ps.setInt(1,1);
            rs= ps.executeQuery();

            if (rs.next()){
                InputStream in=rs.getBinaryStream("file");
                OutputStream out=new FileOutputStream("src//萤火之森.mp3");
                byte[] temp=new byte[1024];
                int len=-1;
                while ((len=in.read(temp))!=-1){
                    out.write(temp);
                }
                in.close();
                out.close();
                System.out.println("音频文件读取成功!");
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //释放资源
            if (rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }


    }


    public static void main(String[] args) {
        ReadFileToLocal();
    }


}

运行代码:

成功取出! 

播放完全没问题·! 

 我的JDBC基础的学习在这里就画下的句号了!学习新知识去喽。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 前提知识点
  • 具体实现步骤
    • 1.打开MySQL,并创建一个名为files的数据库,然后创建数据表。
      • 2.将文件写入到数据库中myFile表的file字段。
      •  3.读取数据库里的音频
      相关产品与服务
      云数据库 SQL Server
      腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档