في المثال التالي، نقوم بتخزين واسترجاع ملف من وإلى قاعدة بيانات MySQL.
الخانة التي ستحتوي على الملف يجب أن تكون من صنف "BLOB "Binary Large Object أو "CLOB "Character Large Object. وكما يتضح من الإسم فإن ال BLOB تستخدم بالنسبة لل Binary files بينما CLOB تستعمل لل Character files.
الجدول الذي سنستخدمه هو على الشكل التالي، وهو يحتوي على أسماء أشخاص وصورهم. الصور هي عبارة عن binary data، لذلك استخدمنا الصنف BLOB بدل CLOB. في MySQL، هناك أربعة أنواع من BLOB، تختلف حسب الحجم الذي تستطيع تخزينه TinyBLOB, BLOB, MediumBLOB, LongBLOB
الفئة المسؤولة عن تخزين الصورة
package photostore;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class StorePhoto {
public void store(Connection con, String name, InputStream photo)
throws SQLException {
PreparedStatement statement = con.prepareStatement("insert into photos(name, photo) values(?, ?);");
statement.setString(1, name);
statement.setBlob(2, photo);
statement.executeUpdate();
System.out.println("Photo added.");
}
}الفئة التي تقوم باسترجاع الصورة
package photostore;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class RetrievePhoto {
public byte[] retrievePhoto(Connection con, String name)
throws SQLException {
PreparedStatement statement = con.prepareStatement("select photo from photos where name = ?;");
statement.setString(1, name);
ResultSet rs = statement.executeQuery();
if (rs.next()) {
Blob photo = rs.getBlob(1);
return photo.getBytes(1, (int)photo.length());
} else {
System.out.println("No photo found.");
return new byte[]{};
}
}
}الآن نقوم ببناء واجهة نستخدم فيها الفئتين السابقتين
لإضافة صورة، نكتب أولا الإسم، نضغط على الزر browse لتحديد الصورة، ثم نضغط على الزر add
لإظهار صورة، نكتب الإسم، نضغط على الزر display، وتظهر الصورة في JLabel مخصص لهذا الغرض. طبعا يجب أن يكون الإسم موجودا في قاعدة البيانات
كود زر add
private void btnAddActionPerformed(java.awt.event.ActionEvent evt) {
StorePhoto store = new StorePhoto();
try {
store.store(con, txtName.getText(), new FileInputStream(photoFile));
} catch (FileNotFoundException ex) {
System.out.println(ex.getMessage());
} catch (SQLException ex) {
System.out.println("Failed to store the photo - " + ex.getMessage());
}
}كود الزر display
private void btnDisplayActionPerformed(java.awt.event.ActionEvent evt) {
RetrievePhoto retrieve = new RetrievePhoto();
try {
byte[] photo = retrieve.retrievePhoto(con, txtName2.getText());
ImageIcon icon = new ImageIcon(photo);
lblPhoto.setIcon(icon);
} catch (SQLException ex) {
System.out.println("Failed to retrieve the photo - " + ex.getMessage());
}
}المشروع NetBeans مرفق

