新聞中心
在現(xiàn)代互聯(lián)網(wǎng)時代,圖片已經(jīng)成為了信息傳遞中不可或缺的一部分。大量的網(wǎng)站都需要圖片的支持,而對于這些圖片的存儲和管理,數(shù)據(jù)庫成為了一種非常方便、高效的選擇。Java作為現(xiàn)代編程語言中更受歡迎的一種,也可以利用其自帶的數(shù)據(jù)庫接口,實現(xiàn)對圖片的存儲和管理。本篇文章將會詳細介紹如何在Java中使用數(shù)據(jù)庫實現(xiàn)圖片存儲,包括建立數(shù)據(jù)庫連接、創(chuàng)建表結(jié)構(gòu)、存儲圖片、讀取圖片等內(nèi)容。

建立數(shù)據(jù)庫連接
在Java中,我們可以使用JDBC(Java Database Connectivity)來建立與數(shù)據(jù)庫的連接。具體來說,我們需要引入數(shù)據(jù)庫驅(qū)動程序,并在代碼中使用連接串來建立連接。下面是一個示例代碼:
“`
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DbConnector {
Connection conn;
public DbConnector() {
try {
Class.forName(“com.mysql.cj.jdbc.Driver”);
String url = “jdbc:mysql://localhost:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC”;
String user = “root”;
String pwd = “password”;
this.conn = DriverManager.getConnection(url, user, pwd);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
public Connection getConn() {
return conn;
}
public void close() {
if (this.conn != null) {
try {
this.conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
“`
這個類中定義了一個`Connection`類型的`conn`變量,用于存儲連接對象。在構(gòu)造函數(shù)中,我們首先使用`Class.forName()`方法引入了數(shù)據(jù)庫驅(qū)動程序。然后,我們定義了一個連接串,其中需要填寫具體的數(shù)據(jù)庫地址、用戶名和密碼。使用`DriverManager.getConnection()`方法,傳入連接串即可建立與數(shù)據(jù)庫的連接。注意到在這個連接串中,我們需要使用`allowPublicKeyRetrieval=true`,這是為了避免在使用新版MySQL時需要進行SSL配置的問題。
創(chuàng)建表結(jié)構(gòu)
接下來,我們需要在數(shù)據(jù)庫中創(chuàng)建一個表來存儲圖片。在這個表中,我們需要為每個圖片存儲以下信息:
– 圖片ID(唯一標識每個圖片的ID)
– 圖片名稱(用于方便查找和管理)
– 圖片二進制數(shù)據(jù)(真正存儲圖片的數(shù)據(jù))
下面是一個示例DDL語句,用于在MySQL數(shù)據(jù)庫中創(chuàng)建這個表:
“`
CREATE TABLE image (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
data MEDIUMBLOB
);
“`
這個表中,`id`列是一個自增的整數(shù),作為圖片的唯一標識;`name`列是一個長度為255的字符串,用于存儲圖片的名稱;`data`列是一個MEDIUMBLOB類型,用于存儲圖片的二進制數(shù)據(jù)。
存儲圖片
在建立好數(shù)據(jù)庫連接和表結(jié)構(gòu)之后,我們現(xiàn)在可以將圖片存儲到數(shù)據(jù)庫中了。具體地,我們可以將圖片的二進制數(shù)據(jù)作為一個參數(shù)傳給`PreparedStatement`對象的`setBytes()`方法,然后執(zhí)行`executeUpdate()`方法即可完成對圖片的存儲。下面是一個示例代碼:
“`
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DbImage {
public static void storeImage(Connection conn, String name, String filePath) {
String sql = “INSERT INTO image(name, data) VALUES (?, ?)”;
try {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, name);
InputStream is = new FileInputStream(filePath);
byte[] data = new byte[is.avlable()];
is.read(data);
ps.setBytes(2, data);
ps.executeUpdate();
ps.close();
is.close();
} catch (SQLException | IOException e) {
e.printStackTrace();
}
}
}
“`
這個類中定義了一個`storeImage()`方法,用于將圖片存儲到數(shù)據(jù)庫中。在這個方法中,我們首先構(gòu)造了一個`sql`語句,用于表示對數(shù)據(jù)庫中的`image`表執(zhí)行插入操作。然后,我們使用`PreparedStatement`對象,將`name`和`data`對應(yīng)的值綁定到`?`占位符上。接下來,我們使用`FileInputStream`讀取圖片的二進制數(shù)據(jù),存儲到一個`byte`數(shù)組中。我們使用`ps.executeUpdate()`方法執(zhí)行插入操作,將圖片信息存儲到數(shù)據(jù)庫中。
讀取圖片
在將圖片存儲到數(shù)據(jù)庫中之后,我們現(xiàn)在需要從數(shù)據(jù)庫中讀取出來,渲染到網(wǎng)頁上。這個過程涉及到從數(shù)據(jù)庫中讀取二進制數(shù)據(jù),并將其轉(zhuǎn)換為網(wǎng)頁可以顯示的圖片格式。在Java中,我們可以使用`ResultSet`對象的`getBinaryStream()`方法,將MEDIUMBLOB類型的數(shù)據(jù)讀取為一個`InputStream`對象。然后,我們可以使用`BufferedImage`對象將這個二進制流轉(zhuǎn)換成一個可以顯示的圖片。下面是一個示例代碼:
“`
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.imageio.ImageIO;
public class DbImage {
public static BufferedImage loadImage(Connection conn, int id) {
String sql = “SELECT * FROM image WHERE id = ?”;
try {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
ByteArrayInputStream bs = new ByteArrayInputStream(rs.getBytes(“data”));
BufferedImage img = ImageIO.read(bs);
bs.close();
rs.close();
ps.close();
return img;
}
rs.close();
ps.close();
} catch (SQLException | IOException e) {
e.printStackTrace();
}
return null;
}
}
“`
這個類中定義了一個`loadImage()`方法,用于從數(shù)據(jù)庫中讀取圖片。在這個方法中,我們首先構(gòu)造了一個`sql`語句,用于表示從數(shù)據(jù)庫中讀取ID為`id`的圖片信息。然后,我們使用`PreparedStatement`對象,將`id`對應(yīng)的值綁定到`?`占位符上。接下來,我們使用`ps.executeQuery()`方法執(zhí)行查詢操作,并使用`rs.next()`判斷結(jié)果集中是否有數(shù)據(jù)。如果有,我們可以使用`rs.getBytes()`方法讀取`data`列中的MEDIUMBLOB類型的二進制流,將其轉(zhuǎn)換成一個`ImageIO`對象,最后返回這個對象。
結(jié)語
本篇文章詳細介紹了如何在Java中使用數(shù)據(jù)庫實現(xiàn)圖片存儲。具體來說,我們介紹了如何建立數(shù)據(jù)庫連接、創(chuàng)建表結(jié)構(gòu)、存儲圖片和讀取圖片等操作。通過這些基本操作,我們可以快速地實現(xiàn)圖片的存儲和管理,為現(xiàn)代互聯(lián)網(wǎng)應(yīng)用提供更好的體驗和支持。希望本篇文章能夠?qū)ava初學(xué)者和互聯(lián)網(wǎng)開發(fā)者有所幫助。
相關(guān)問題拓展閱讀:
- 用Java能不能把一張圖片存到MySQL數(shù)據(jù)庫中啊
- java:servlet接收圖片,并把它保存到數(shù)據(jù)庫中
用Java能不能把一張圖片存到MySQL數(shù)據(jù)庫中啊
MySQL 不是文本類數(shù)據(jù)存儲,不能直接存儲圖片和文件。
可以,用BLOB,但是不推薦這么做,保存路徑比較好
數(shù)據(jù)庫中使用blob字段。 不過建議還是存儲圖片路徑吧,數(shù)據(jù)庫的輸出流慢的多
java:servlet接收圖片,并把它保存到數(shù)據(jù)庫中
這種代碼網(wǎng)上不是一大片嗎
public boolean storeImage(File file){
純尺 try{
// 打開文件
FileInputStream fin = new FileInputStream(file);
// 建一個緩沖保存數(shù)據(jù)
ByteBuffer nbf = ByteBuffer.allocate((int) file.length());
byte array = new byte;
int offset = 0, length = 0;
薯老 // 讀存數(shù)據(jù)
while((length = fin.read(array)) > 0){
if(length != 1024) nbf.put(array,0,length);
else nbf.put(array);
offset += length;
}
// 關(guān)閉文件
fin.close();
// 新建一個數(shù)組保存要寫的內(nèi)容
byte content = nbf.array();
String sql = “insert into images (bin_data) values (?) “;
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setBytes(1,content);
pstmt.execute();
pstmt.close();
}catch(Exception e){
e.printStackTrace();
return false;
}
數(shù)褲升 return true;
}
關(guān)于java數(shù)據(jù)庫存儲圖片的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級標準機房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達10T,機柜接入千兆交換機,能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認可。
名稱欄目:Java數(shù)據(jù)庫實現(xiàn)圖片存儲詳解(java數(shù)據(jù)庫存儲圖片)
文章路徑:http://www.5511xx.com/article/cohehij.html


咨詢
建站咨詢
