You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Java在OrientDB中存储、检索图片及相关技术疑问

嘿,作为OrientDB新手,你的这些问题都很实在,我来帮你一一理清:

OrientDB二进制数据存储常见问题解答

1. 存储二进制数据的元素类型

全模式(Schema Full)场景

当你使用Schema Full模式时,需要预先为类的属性指定类型,存储图片这类二进制数据的属性类型是BINARY。比如你可以通过SQL语句创建带二进制属性的类:

CREATE CLASS ImageLibrary EXTENDS V;
CREATE PROPERTY ImageLibrary.imageContent BINARY;
CREATE PROPERTY ImageLibrary.fileName STRING;

这样后续往ImageLibrary类中存入的imageContent属性就会被强制以二进制类型存储。

无模式(Schema Less)场景

无模式下不需要预先定义属性类型,当你往ODocument中存入byte[]类型的数据时,OrientDB会自动识别并将该字段标记为BINARY类型,底层同样以二进制格式存储数据。

2. 示例代码中的doc会保存到哪里?

你提到的这段代码:

ODocument doc = new ODocument(); 
doc.field("binary", "Binary data".getBytes()); 
doc.save();

这个doc是一个无类的独立文档,它不属于任何你预先创建的类,会被直接存储在数据库中,你可以通过它保存后返回的RID(比如#12:0这种格式的记录ID)来定位和检索它。在OrientDB Studio中,你可以在「Documents」标签页下找到这些无类文档。

3. 保存/检索图片的完整示例

全模式(Schema Full)示例

第一步:创建类和属性(通过SQL或Studio)

CREATE CLASS ImageStore EXTENDS V;
CREATE PROPERTY ImageStore.imageData BINARY;
CREATE PROPERTY ImageStore.imageName STRING;

第二步:Java代码保存图片

import com.orientechnologies.orient.core.db.ODatabaseSession;
import com.orientechnologies.orient.core.db.OrientDB;
import com.orientechnologies.orient.core.db.OrientDBConfig;
import com.orientechnologies.orient.core.record.OVertex;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class SchemaFullImageSave {
    public static void main(String[] args) {
        // 连接本地OrientDB实例
        try (OrientDB orientDB = new OrientDB("remote:localhost", OrientDBConfig.defaultConfig())) {
            // 打开目标数据库(替换为你的数据库名、用户名、密码)
            try (ODatabaseSession db = orientDB.open("my-db", "admin", "admin")) {
                // 读取本地图片为字节数组
                File imageFile = new File("/path/to/your/photo.jpg");
                byte[] imageBytes = new byte[(int) imageFile.length()];
                try (FileInputStream fis = new FileInputStream(imageFile)) {
                    fis.read(imageBytes);
                } catch (IOException e) {
                    e.printStackTrace();
                    return;
                }

                // 创建顶点并设置属性
                OVertex imageVertex = db.newVertex("ImageStore");
                imageVertex.setProperty("imageName", "vacation-photo.jpg");
                imageVertex.setProperty("imageData", imageBytes);
                // 保存到数据库
                imageVertex.save();

                System.out.println("图片保存成功,RID:" + imageVertex.getIdentity());
            }
        }
    }
}

第三步:Java代码检索图片

import com.orientechnologies.orient.core.db.ODatabaseSession;
import com.orientechnologies.orient.core.db.OrientDB;
import com.orientechnologies.orient.core.db.OrientDBConfig;
import com.orientechnologies.orient.core.record.OVertex;
import com.orientechnologies.orient.core.id.ORID;

import java.io.FileOutputStream;
import java.io.IOException;

public class SchemaFullImageRetrieve {
    public static void main(String[] args) {
        try (OrientDB orientDB = new OrientDB("remote:localhost", OrientDBConfig.defaultConfig())) {
            try (ODatabaseSession db = orientDB.open("my-db", "admin", "admin")) {
                // 替换为实际保存的RID
                ORID imageRID = new ORID(12, 0);
                OVertex retrievedImage = db.load(imageRID);

                // 获取属性
                String imageName = retrievedImage.getProperty("imageName");
                byte[] imageBytes = retrievedImage.getProperty("imageData");

                // 将字节数组写回本地文件
                try (FileOutputStream fos = new FileOutputStream("retrieved-" + imageName)) {
                    fos.write(imageBytes);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                System.out.println("图片检索并保存成功!");
            }
        }
    }
}

无模式(Schema Less)示例

保存图片的Java代码

import com.orientechnologies.orient.core.db.ODatabaseSession;
import com.orientechnologies.orient.core.db.OrientDB;
import com.orientechnologies.orient.core.db.OrientDBConfig;
import com.orientechnologies.orient.core.record.ODocument;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class SchemaLessImageSave {
    public static void main(String[] args) {
        try (OrientDB orientDB = new OrientDB("remote:localhost", OrientDBConfig.defaultConfig())) {
            try (ODatabaseSession db = orientDB.open("my-db", "admin", "admin")) {
                File imageFile = new File("/path/to/your/diagram.png");
                byte[] imageBytes = new byte[(int) imageFile.length()];
                try (FileInputStream fis = new FileInputStream(imageFile)) {
                    fis.read(imageBytes);
                } catch (IOException e) {
                    e.printStackTrace();
                    return;
                }

                // 创建无模式文档
                ODocument imageDoc = new ODocument();
                imageDoc.field("fileName", "architecture-diagram.png");
                imageDoc.field("fileData", imageBytes);
                imageDoc.save();

                System.out.println("无模式图片保存成功,RID:" + imageDoc.getIdentity());
            }
        }
    }
}

检索图片的Java代码

import com.orientechnologies.orient.core.db.ODatabaseSession;
import com.orientechnologies.orient.core.db.OrientDB;
import com.orientechnologies.orient.core.db.OrientDBConfig;
import com.orientechnologies.orient.core.record.ODocument;
import com.orientechnologies.orient.core.id.ORID;

import java.io.FileOutputStream;
import java.io.IOException;

public class SchemaLessImageRetrieve {
    public static void main(String[] args) {
        try (OrientDB orientDB = new OrientDB("remote:localhost", OrientDBConfig.defaultConfig())) {
            try (ODatabaseSession db = orientDB.open("my-db", "admin", "admin")) {
                // 替换为实际的RID
                ORID docRID = new ORID(13, 0);
                ODocument retrievedDoc = db.load(docRID);

                String fileName = retrievedDoc.field("fileName");
                byte[] fileBytes = retrievedDoc.field("fileData");

                try (FileOutputStream fos = new FileOutputStream("retrieved-" + fileName)) {
                    fos.write(fileBytes);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                System.out.println("无模式图片检索成功!");
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者user2115364

火山引擎 最新活动