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

前言

上次写了一个用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的数据库,然后创建数据表。

 代码如下(示例):

create database files default character set = "utf8mb4";
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();
    }


}

运行代码:

 

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


}

运行代码:

成功取出! 

播放完全没问题·! 

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

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
使用 JDBC数据库插入数据需要以下几个步骤: 1. 加载数据库驱动程序 在使用 JDBC 操作数据库之前,需要先加载数据库驱动程序。比如,如果要连接 MySQL 数据库,则需要加载 MySQL 的 JDBC 驱动程序。可以通过以下代码加载 MySQL 驱动程序: ``` Class.forName("com.mysql.jdbc.Driver"); ``` 2. 建立数据库连接 使用 DriverManager 类的 getConnection() 方法建立数据库连接。getConnection() 方法需要传入三个参数:数据库连接 URL、用户名和密码。例如: ``` Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456"); ``` 3. 创建 SQL 语句 使用 SQL 语句向数据库插入数据。例如,以下代码创建一个 INSERT 语句: ``` String sql = "INSERT INTO user(name, age, email) VALUES('Tom', 18, 'tom@example.com')"; ``` 4. 执行 SQL 语句 使用 Statement 或 PreparedStatement 对象执行 SQL 语句。例如,以下代码使用 Statement 对象执行 INSERT 语句: ``` Statement stmt = conn.createStatement(); stmt.executeUpdate(sql); ``` 5. 关闭数据库连接 在使用数据库后,需要关闭数据库连接。例如: ``` stmt.close(); conn.close(); ``` 完整的 Java 代码示例: ``` import java.sql.*; public class JdbcDemo { public static void main(String[] args) { try { // 加载数据库驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 建立数据库连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456"); // 创建 SQL 语句 String sql = "INSERT INTO user(name, age, email) VALUES('Tom', 18, 'tom@example.com')"; // 执行 SQL 语句 Statement stmt = conn.createStatement(); stmt.executeUpdate(sql); // 关闭数据库连接 stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 注意:以上代码示例仅供参考,实际使用时需要根据具体情况修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

害恶细君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值