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

建立數(shù)據(jù)庫(kù)連接
在Java中,我們可以使用JDBC(Java Database Connectivity)來(lái)建立與數(shù)據(jù)庫(kù)的連接。具體來(lái)說(shuō),我們需要引入數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,并在代碼中使用連接串來(lái)建立連接。下面是一個(gè)示例代碼:
“`
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();
}
}
}
}
“`
這個(gè)類中定義了一個(gè)`Connection`類型的`conn`變量,用于存儲(chǔ)連接對(duì)象。在構(gòu)造函數(shù)中,我們首先使用`Class.forName()`方法引入了數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序。然后,我們定義了一個(gè)連接串,其中需要填寫(xiě)具體的數(shù)據(jù)庫(kù)地址、用戶名和密碼。使用`DriverManager.getConnection()`方法,傳入連接串即可建立與數(shù)據(jù)庫(kù)的連接。注意到在這個(gè)連接串中,我們需要使用`allowPublicKeyRetrieval=true`,這是為了避免在使用新版MySQL時(shí)需要進(jìn)行SSL配置的問(wèn)題。
創(chuàng)建表結(jié)構(gòu)
接下來(lái),我們需要在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)表來(lái)存儲(chǔ)圖片。在這個(gè)表中,我們需要為每個(gè)圖片存儲(chǔ)以下信息:
– 圖片ID(唯一標(biāo)識(shí)每個(gè)圖片的ID)
– 圖片名稱(用于方便查找和管理)
– 圖片二進(jìn)制數(shù)據(jù)(真正存儲(chǔ)圖片的數(shù)據(jù))
下面是一個(gè)示例DDL語(yǔ)句,用于在MySQL數(shù)據(jù)庫(kù)中創(chuàng)建這個(gè)表:
“`
CREATE TABLE image (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
data MEDIUMBLOB
);
“`
這個(gè)表中,`id`列是一個(gè)自增的整數(shù),作為圖片的唯一標(biāo)識(shí);`name`列是一個(gè)長(zhǎng)度為255的字符串,用于存儲(chǔ)圖片的名稱;`data`列是一個(gè)MEDIUMBLOB類型,用于存儲(chǔ)圖片的二進(jìn)制數(shù)據(jù)。
存儲(chǔ)圖片
在建立好數(shù)據(jù)庫(kù)連接和表結(jié)構(gòu)之后,我們現(xiàn)在可以將圖片存儲(chǔ)到數(shù)據(jù)庫(kù)中了。具體地,我們可以將圖片的二進(jìn)制數(shù)據(jù)作為一個(gè)參數(shù)傳給`PreparedStatement`對(duì)象的`setBytes()`方法,然后執(zhí)行`executeUpdate()`方法即可完成對(duì)圖片的存儲(chǔ)。下面是一個(gè)示例代碼:
“`
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();
}
}
}
“`
這個(gè)類中定義了一個(gè)`storeImage()`方法,用于將圖片存儲(chǔ)到數(shù)據(jù)庫(kù)中。在這個(gè)方法中,我們首先構(gòu)造了一個(gè)`sql`語(yǔ)句,用于表示對(duì)數(shù)據(jù)庫(kù)中的`image`表執(zhí)行插入操作。然后,我們使用`PreparedStatement`對(duì)象,將`name`和`data`對(duì)應(yīng)的值綁定到`?`占位符上。接下來(lái),我們使用`FileInputStream`讀取圖片的二進(jìn)制數(shù)據(jù),存儲(chǔ)到一個(gè)`byte`數(shù)組中。我們使用`ps.executeUpdate()`方法執(zhí)行插入操作,將圖片信息存儲(chǔ)到數(shù)據(jù)庫(kù)中。
讀取圖片
在將圖片存儲(chǔ)到數(shù)據(jù)庫(kù)中之后,我們現(xiàn)在需要從數(shù)據(jù)庫(kù)中讀取出來(lái),渲染到網(wǎng)頁(yè)上。這個(gè)過(guò)程涉及到從數(shù)據(jù)庫(kù)中讀取二進(jìn)制數(shù)據(jù),并將其轉(zhuǎn)換為網(wǎng)頁(yè)可以顯示的圖片格式。在Java中,我們可以使用`ResultSet`對(duì)象的`getBinaryStream()`方法,將MEDIUMBLOB類型的數(shù)據(jù)讀取為一個(gè)`InputStream`對(duì)象。然后,我們可以使用`BufferedImage`對(duì)象將這個(gè)二進(jìn)制流轉(zhuǎn)換成一個(gè)可以顯示的圖片。下面是一個(gè)示例代碼:
“`
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;
}
}
“`
這個(gè)類中定義了一個(gè)`loadImage()`方法,用于從數(shù)據(jù)庫(kù)中讀取圖片。在這個(gè)方法中,我們首先構(gòu)造了一個(gè)`sql`語(yǔ)句,用于表示從數(shù)據(jù)庫(kù)中讀取ID為`id`的圖片信息。然后,我們使用`PreparedStatement`對(duì)象,將`id`對(duì)應(yīng)的值綁定到`?`占位符上。接下來(lái),我們使用`ps.executeQuery()`方法執(zhí)行查詢操作,并使用`rs.next()`判斷結(jié)果集中是否有數(shù)據(jù)。如果有,我們可以使用`rs.getBytes()`方法讀取`data`列中的MEDIUMBLOB類型的二進(jìn)制流,將其轉(zhuǎn)換成一個(gè)`ImageIO`對(duì)象,最后返回這個(gè)對(duì)象。
結(jié)語(yǔ)
本篇文章詳細(xì)介紹了如何在Java中使用數(shù)據(jù)庫(kù)實(shí)現(xiàn)圖片存儲(chǔ)。具體來(lái)說(shuō),我們介紹了如何建立數(shù)據(jù)庫(kù)連接、創(chuàng)建表結(jié)構(gòu)、存儲(chǔ)圖片和讀取圖片等操作。通過(guò)這些基本操作,我們可以快速地實(shí)現(xiàn)圖片的存儲(chǔ)和管理,為現(xiàn)代互聯(lián)網(wǎng)應(yīng)用提供更好的體驗(yàn)和支持。希望本篇文章能夠?qū)ava初學(xué)者和互聯(lián)網(wǎng)開(kāi)發(fā)者有所幫助。
相關(guān)問(wèn)題拓展閱讀:
- 用Java能不能把一張圖片存到MySQL數(shù)據(jù)庫(kù)中啊
- java:servlet接收?qǐng)D片,并把它保存到數(shù)據(jù)庫(kù)中
用Java能不能把一張圖片存到MySQL數(shù)據(jù)庫(kù)中啊
MySQL 不是文本類數(shù)據(jù)存儲(chǔ),不能直接存儲(chǔ)圖片和文件。
可以,用BLOB,但是不推薦這么做,保存路徑比較好
數(shù)據(jù)庫(kù)中使用blob字段。 不過(guò)建議還是存儲(chǔ)圖片路徑吧,數(shù)據(jù)庫(kù)的輸出流慢的多
java:servlet接收?qǐng)D片,并把它保存到數(shù)據(jù)庫(kù)中
這種代碼網(wǎng)上不是一大片嗎
public boolean storeImage(File file){
純尺 try{
// 打開(kāi)文件
FileInputStream fin = new FileInputStream(file);
// 建一個(gè)緩沖保存數(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();
// 新建一個(gè)數(shù)組保存要寫(xiě)的內(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ù)庫(kù)存儲(chǔ)圖片的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級(jí)標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認(rèn)可。
分享文章:Java數(shù)據(jù)庫(kù)實(shí)現(xiàn)圖片存儲(chǔ)詳解(java數(shù)據(jù)庫(kù)存儲(chǔ)圖片)
網(wǎng)站網(wǎng)址:http://m.fisionsoft.com.cn/article/cohehij.html


咨詢
建站咨詢
