Java里怎么把Blob上传到MySQL数据库,简单点说就是这个过程和方法
- 问答
- 2026-01-16 12:01:21
- 1
在MySQL数据库里打好基础
在你动手写Java代码之前,得先让数据库知道你要存这种东西,你需要在某张表里,专门准备一个列(字段)来存放Blob数据,MySQL提供了几种放二进制的类型,最常用的两种是:
- BLOB:这个适合存不太大的数据,比如最多64KB的图片或者文档。
- LONGBLOB:这个就厉害多了,能存超级大的数据,最大能到4GB,如果你要存高清照片、长视频或者大的压缩包,就得用它。
你怎么设置呢?通常是用像Navicat这种数据库管理工具或者直接写SQL语句来建表或修改表,你可以创建一张叫 user_profile 的表,里面有一个放头像的字段:
CREATE TABLE user_profile (
id INT PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(100),
avatar LONGBLOB -- 就是这个字段,用来存头像图片的数据
);
这样,数据库这边的“坑”就挖好了,就等着Java把“萝卜”(Blob数据)填进来。
第二步:在Java程序里准备好家当
要让Java能和MySQL对话,你需要一个叫JDBC驱动的东西,通常我们会把它作为依赖包添加到项目里,如果你用的是Maven这样的管理工具,就在 pom.xml 文件里加上这一段(根据来源,例如MySQL官方文档提供的依赖声明):

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version> <!-- 版本号用最新的就行 -->
</dependency>
加了依赖,Java项目就知道怎么和MySQL打交道了。
第三步:写Java代码完成上传
这是最核心的一步,整个过程就像是你去邮局寄一个包裹:

- 建立连接:你得找到邮局(数据库)在哪,并走过去(建立连接)。
- 准备包裹:然后把要寄的文件(
photo.jpg)打包好(读进Java程序)。 - 填写邮寄单:告诉邮局工作人员(数据库)这个包裹要寄到哪个地址(插入到哪张表的哪个字段)。
- 寄出包裹:把包裹交给工作人员(执行SQL语句)。
下面是具体的代码是怎么体现这个过程的:
import java.sql.*;
import java.io.*;
public class BlobUploader {
public static void main(String[] args) {
// 这四行是数据库的“地址和钥匙”
String url = "jdbc:mysql://你的服务器地址:3306/你的数据库名?useSSL=false&serverTimezone=UTC";
String user = "你的数据库用户名";
String password = "你的数据库密码";
// 1. 建立连接 - 走去邮局
try (Connection connection = DriverManager.getConnection(url, user, password)) {
// 你要上传的文件的路径,quot;C:\\images\\avatar.png"
String filePath = "你的文件完整路径";
File file = new File(filePath);
// 2. 准备包裹 - 创建一个输入流来读文件内容
FileInputStream inputStream = new FileInputStream(file);
// 3. 填写邮寄单 - 准备SQL语句,那个问号? 就是给Blob数据留的空位
String sql = "INSERT INTO user_profile (user_name, avatar) VALUES (?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
// 给邮寄单填空:第一个问号填用户名
statement.setString(1, "张三");
// 第二个问号填文件数据!setBinaryStream方法会把文件流塞进去
statement.setBinaryStream(2, inputStream, file.length());
// 4. 寄出包裹 - 执行插入操作
int rowsInserted = statement.executeUpdate();
if (rowsInserted > 0) {
System.out.println("文件上传成功!");
}
// 记得关掉流和语句,好习惯就像寄完包裹要跟工作人员说谢谢再见
statement.close();
inputStream.close();
} catch (SQLException | IOException e) {
e.printStackTrace(); // 如果出错了,把错误信息打印出来看看
}
}
}
重点解释一下关键点:
- 为什么用
PreparedStatement? 因为它安全又方便,它用问号 当占位符,能有效防止一种叫“SQL注入”的攻击,而且特别适合用来设置像Blob这种复杂的数据。 setBinaryStream是干嘛的? 这是最关键的一招,它告诉JDBC驱动:“你听着,我这儿有一个数据流(就是那个inputStream),你直接把这个流里的所有数据,原封不动地塞到数据库那个Blob字段里去。” 后面的file.length()是告诉数据库这个数据大概有多长,有时候不写也行,但写上更规范。- 异常处理:代码外面的
try-catch块很重要,因为网络连接、读文件、数据库操作都可能出错,必须抓住这些错误,不然程序会崩溃。
额外提醒一个小问题:数据库性能
虽然技术上能把很大的文件存进数据库,但并不是越大越好,如果你要存的是很多非常大的文件(比如几十兆以上的视频),频繁读写可能会让数据库变得很慢,这种情况下,更常见的做法是把文件存到专门的文件服务器(比如阿里云OSS、腾讯云COS)或者硬盘上,然后在数据库里只存一个能找到这个文件的网址(URL),但如果你存的是数量不多、大小在几兆以内的文件(比如用户头像、证件照扫描件),用Blob直接存进数据库是最简单直接的办法。
Java把Blob上传到MySQL,本质上就是 用JDBC连接数据库,然后用 PreparedStatement 的 setBinaryStream 方法,把文件流塞到INSERT或UPDATE的SQL语句里,你把上面的代码里的数据库地址、用户名密码、文件路径换成你自己的,基本就能跑通了。
本文由颜泰平于2026-01-16发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/81779.html
