下面我将详细讲解“Java+MySql图片数据保存与读取的具体实例”的完整攻略,并提供两个示例。
1、前置条件
在进行Java+MySql图片数据的保存与读取前,需要保证以下条件已经满足:
- 已经安装好 Java 开发环境
- 已经安装好 MySql 数据库,并且能够在 Java 中连接到该数据库
- 需要使用 JDBC 驱动程序连接 MySql 数据库,可以手动下载并添加该驱动,或者使用 Maven 或 Gradle 等依赖管理工具来添加该驱动
2、图片数据保存实例
首先需要一个保存图片到 MySql 数据库的方法,代码如下:
public static void saveImageToDatabase(String imagePath) throws SQLException, IOException {
Connection connection = null;
PreparedStatement statement = null;
FileInputStream inputStream = null;
try {
connection = getConnection(); // 获取数据库连接
inputStream = new FileInputStream(imagePath); // 创建输入流对象
statement = connection.prepareStatement("INSERT INTO image (name, content) VALUES (?, ?)"); // 创建 PreparedStatement 对象
statement.setString(1, "test.jpg"); // 设置参数,其中第 1 个参数为文件名
statement.setBinaryStream(2, inputStream, inputStream.available()); // 设置参数,第 2 个参数为输入流
statement.executeUpdate(); // 执行 SQL 语句
} finally {
if (inputStream != null) {
inputStream.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
}
}
该方法接收一个图片文件的路径作为参数,然后打开该文件创建一个输入流对象,再将该输入流传递给 PreparedStatement 对象,执行插入语句。在执行语句时,会将输入流中的数据存储到 MySql 数据库中,以二进制形式存储。
3、图片数据读取实例
接下来需要一个从 MySql 数据库中读取图片数据的方法,代码如下:
public static void readImageFromDatabase() throws SQLException, IOException {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
FileOutputStream outputStream = null;
InputStream inputStream = null;
try {
connection = getConnection(); // 获取数据库连接
statement = connection.prepareStatement("SELECT name, content FROM image WHERE id = 1"); // 创建 PreparedStatement 对象
resultSet = statement.executeQuery(); // 执行查询语句
if (resultSet.next()) {
String filename = resultSet.getString("name"); // 获取文件名
inputStream = resultSet.getBinaryStream("content"); // 获取输入流
outputStream = new FileOutputStream(filename); // 创建输出流对象
byte[] buffer = new byte[1024]; // 创建缓冲区
while (inputStream.read(buffer) > 0) { // 读取输入流中的数据到缓冲区中
outputStream.write(buffer); // 将缓冲区中的数据写入输出流中
}
}
} finally {
if (outputStream != null) {
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
}
}
该方法会从数据库中读取 id 为 1 的图片数据,并将其保存到本地磁盘中。
4、完整代码示例
下面是一个完整的 Java 类示例,其中包含了图片数据的保存和读取:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ImageManager {
private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
private static final String DB_URL = "jdbc:mysql://localhost:3306/test?useSSL=false";
private static final String USERNAME = "root";
private static final String PASSWORD = "123456";
private static Connection getConnection() throws SQLException {
return DriverManager.getConnection(DB_URL, USERNAME, PASSWORD);
}
public static void saveImageToDatabase(String imagePath) throws SQLException, IOException {
Connection connection = null;
PreparedStatement statement = null;
FileInputStream inputStream = null;
try {
connection = getConnection(); // 获取数据库连接
inputStream = new FileInputStream(imagePath); // 创建输入流对象
statement = connection.prepareStatement("INSERT INTO image (name, content) VALUES (?, ?)"); // 创建 PreparedStatement 对象
statement.setString(1, "test.jpg"); // 设置参数,其中第 1 个参数为文件名
statement.setBinaryStream(2, inputStream, inputStream.available()); // 设置参数,第 2 个参数为输入流
statement.executeUpdate(); // 执行 SQL 语句
} finally {
if (inputStream != null) {
inputStream.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
}
}
public static void readImageFromDatabase() throws SQLException, IOException {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
FileOutputStream outputStream = null;
InputStream inputStream = null;
try {
connection = getConnection(); // 获取数据库连接
statement = connection.prepareStatement("SELECT name, content FROM image WHERE id = 1"); // 创建 PreparedStatement 对象
resultSet = statement.executeQuery(); // 执行查询语句
if (resultSet.next()) {
String filename = resultSet.getString("name"); // 获取文件名
inputStream = resultSet.getBinaryStream("content"); // 获取输入流
outputStream = new FileOutputStream(filename); // 创建输出流对象
byte[] buffer = new byte[1024]; // 创建缓冲区
while (inputStream.read(buffer) > 0) { // 读取输入流中的数据到缓冲区中
outputStream.write(buffer); // 将缓冲区中的数据写入输出流中
}
}
} finally {
if (outputStream != null) {
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
}
}
public static void main(String[] args) {
try {
saveImageToDatabase("test.jpg");
readImageFromDatabase();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在以上示例中,通过执行 main 方法,先将图片保存到数据库中,再从数据库中读取图片并保存到本地磁盘中。注意,需要将其中的 DB_URL、USERNAME、PASSWORD 等变量修改为自己本地的 MySql 数据库配置。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java+MySql图片数据保存与读取的具体实例 - Python技术站