Oracle 是众多企业级应用程序的首选数据库,它不仅可以高效地存储结构化数据,还可以灵活地存储各种非结构化数据,比如图片、视频等。本文将主要介绍 Oracle 数据库中如何存储图片。
在 Oracle 中存储图片,有两种方式:
- 将图片存储在数据库表的一个二进制列中;
- 将图片存储在文件系统中,并在数据库表中保存其路径。
哪种方式更好?这取决于您的具体需求。如果您期望数据库自动维护数据完整性、备份和恢复等方面,那么把图片存储在二进制列中肯定是更好的选择。但如果您对数据的存储、管理比较熟悉,那么将图片存储在文件系统,有助于提高访问速度。
下面我们就来看一下如何通过 Oracle Database 实现这两种方式。
方式1:二进制存储
在数据库中建立一个表,其中有一个 BLOB 类型的列,用于存储图片二进制数据。
CREATE TABLE IMAGE_STORE (
ID NUMBER PRIMARY KEY,
NAME VARCHAR2(255),
IMAGE BLOB
);
接下来,我们就可以使用 Java 或者其他编程语言向这个表插入图片二进制数据了。以下是一个简单的 Java 实现:
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO IMAGE_STORE VALUES (?, ?, ?)");
pstmt.setLong(1, 1);
pstmt.setString(2, "avatar.png");
byte[] imageData = readImageDataFromFile("avatar.png");
pstmt.setBytes(3, imageData);
pstmt.executeUpdate();
pstmt.close();
读取数据也很简单,如下所示:
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT IMAGE FROM IMAGE_STORE WHERE ID = 1");
if (rs.next()) {
InputStream inputStream = rs.getBinaryStream(1);
OutputStream outputStream = new FileOutputStream("avatar_copy.png");
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.flush();
outputStream.close();
inputStream.close();
}
方式2:文件系统存储
将图片存储在文件系统中,意味着我们需要多建立一个表,用于保存图片的路径。
CREATE TABLE IMAGE_PATH (
ID NUMBER PRIMARY KEY,
NAME VARCHAR2(255),
PATH VARCHAR2(255)
);
当我们要插入一张图片时,除了在 IMAGE_STORE 表中存储二进制数据外,还需要在 IMAGE_PATH 表中保存该图片的路径。
PreparedStatement pstmt1 = conn.prepareStatement("INSERT INTO IMAGE_STORE VALUES (?, ?, ?)");
pstmt1.setLong(1, 1);
pstmt1.setString(2, "avatar.png");
byte[] imageData = readImageDataFromFile("avatar.png");
pstmt1.setBytes(3, imageData);
pstmt1.executeUpdate();
pstmt1.close();
PreparedStatement pstmt2 = conn.prepareStatement("INSERT INTO IMAGE_PATH VALUES (?, ?, ?)");
pstmt2.setLong(1, 1);
pstmt2.setString(2, "avatar.png");
pstmt2.setString(3, "/path/to/image/avatar.png");
pstmt2.executeUpdate();
pstmt2.close();
读取数据时,首先需要查询 IMAGE_PATH 表获取图片路径,然后我们才能从文件系统中读取图片数据。
Statement stmt1 = conn.createStatement();
ResultSet rs1 = stmt1.executeQuery("SELECT PATH FROM IMAGE_PATH WHERE ID = 1");
String path = null;
if (rs1.next()) {
path = rs1.getString(1);
}
rs1.close();
stmt1.close();
if (path != null) {
InputStream inputStream = new FileInputStream(path);
OutputStream outputStream = new FileOutputStream("avatar_copy.png");
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.flush();
outputStream.close();
inputStream.close();
}
结语
无论是将图片存储在二进制列中还是文件系统中,选择哪种方式都需要根据具体需求来决定。在使用 Oracle 数据库存储图片时,开发者需要对文件的读写操作比较熟悉,设计表结构时也应该充分考虑到数据完整性、备份和恢复等方面的问题。