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

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

前言


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

Java使用JDBC向数据库存取大文本(比如小说等)

https://blog.csdn.net/weixin_50216991/article/details/120642592

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


前提知识点


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


MySQL有4种BLOB类型,如下:

image.png

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

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

具体实现步骤

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

代码如下(示例):

create database files default character set = "utf8mb4";


image.png

create table myFile(
                       id int primary key ,
                       file mediumblob
);

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


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


实现代码如下(示例):

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();
    }
}

85d642f52e49475e9451dc02c6d3c66d.png

067f8d3af206429b876bdfc8e84a4da3.png


3.读取数据库里的音频


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


代码如下:


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();
    }
}

运行代码:

1373a0942fdf4ed08827dd90f6c15701.png

370ba0265bf04d1e941dd0791dda38a9.png

d5014a7d1fa644cc96a248ae52793ffa.png


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
SQL Java 数据库连接
除了JDBC,还有哪些常见的数据库访问技术?
除了JDBC,还有哪些常见的数据库访问技术?
1017 2
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
Java 数据库连接 数据库
【YashanDB知识库】jdbc查询st_geometry类型的数据时抛出YAS-00101 cannot allocate 0 bytes for anlHeapMalloc异常
【YashanDB知识库】jdbc查询st_geometry类型的数据时抛出YAS-00101 cannot allocate 0 bytes for anlHeapMalloc异常
|
人工智能 缓存 自然语言处理
Java与多模态AI:构建支持文本、图像和音频的智能应用
随着大模型从单一文本处理向多模态能力演进,现代AI应用需要同时处理文本、图像、音频等多种信息形式。本文深入探讨如何在Java生态中构建支持多模态AI能力的智能应用。我们将完整展示集成视觉模型、语音模型和语言模型的实践方案,涵盖从文件预处理、多模态推理到结果融合的全流程,为Java开发者打开通往下一代多模态AI应用的大门。
773 41
|
NoSQL Java API
在Java环境下如何进行Redis数据库的操作
总的来说,使用Jedis在Java环境下进行Redis数据库的操作,是一种简单而高效的方法。只需要几行代码,就可以实现复杂的数据操作。同时,Jedis的API设计得非常直观,即使是初学者,也可以快速上手。
584 94
|
前端开发 JavaScript Java
Java中将图片转换为base64格式的技巧
这样,你就可以在Java中将图片转换为Base64格式了。这个方法的实现非常简单,只需要使用Java的内置库,无需任何额外的库。希望这个方法对你有所帮助。
1078 22
|
Java 数据库连接 定位技术
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
本文以GIS表为例,介绍通过Java代码向数据库插入POINT类型地理数据的方法。首先创建包含ID和POS字段的GIS表,POS字段为ST_GEOMETRY类型。接着利用Java的PreparedStatement批量插入10条经纬度相同的POINT数据,最后查询结果显示成功插入10条记录,验证了操作的正确性。
325 19
|
Java 关系型数据库 MySQL
Java汽车租赁系统源码(含数据库脚本)
Java汽车租赁系统源码(含数据库脚本)
834 4
|
Java 数据库连接 定位技术
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
|
Java 数据库连接 定位技术
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据