如何用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




