《MongoDB、Java与对象关系映射》由会员分享,可在线阅读,更多相关《MongoDB、Java与对象关系映射(8页珍藏版)》请在金锄头文库上搜索。
1、MongoDBMongoDB、JavaJava 与对象关系映射与对象关系映射2012-05-10 09:44 陈晨编译 伯乐在线 我要评论(0) 字号:T | T当今 NoSQL 领域中有很多有力的竞争者通过多种方式来处理海量数据问题。其中重要的解决方案之一就是 MongoDB。MongoDB 是面向文档的弱结构化存储方案,使用 JSON 格式来展现、查询和修改数据。AD:MongoDBMongoDB 介绍介绍当今 NoSQL 领域中有很多有力的竞争者通过多种方式来处理海量数据问题。其中重要的解决方案之一就是 MongoDB。MongoDB 是面向文档的弱结构化存储方案,使用 JSON 格式来
2、展现、查询和修改数据。MongoDB 文档相当完备,扩展规模与安装一样简单。它提供冗余、切片、索引以及map/reduce 等概念支持。MongoDB 的开源社区非常大且非常活跃。MongoDB 在很多大型产品中被实际运用,如:Disney, Craigslist, Foursquare, Github 和SourceForge。MongoDB 是一个开源项目,由 建立并维护,该公司由DoubleClick 的前任执行人员创立。同时,10gen 也提供了极好的商业支持与参与建设。MongoDB 与 NoSQL: 缺陷与优势MongoDB 作为一个可用 NoSQL 方案具有很多优势。我刚开始接
3、触 nosql 数据库了解了一系列基于 Java 的方案,并且花了大量的时间来弄懂什么是列家族,Hadoop 与 HBase 的关系,ZooKeeper 到底是什么。当我终于全部清楚之后,发现 Cassandra 与 HBase 确实是对于 NoSQL 领域非常可靠、可信赖的解决方案。但与其他的解决方案相比,MongoDB 让我在能够开始写代码之前,不用理解那么多的概念。与其他软件相似,MongoDB 也存在缺陷。经过一段时间使用 MongoDB,我列举经历过并需要注意的一些事情,我成为“Gotchas”: 不要按照关系型数据库来思考。这很明显,MongoDB 使得构建和执行复杂查询变得非常容
4、易。当实际使用的时候,你会主要关注于效率问题(像我一样)。 MongoDB 的索引是二进制的树。如果你不是很熟悉 B-tree,可能需要了解一下。这些都涉及到构建符合提供查询条件需求的建立索引的方式。 小心的设计索引结构。这涉及到上面提到的 B-tree。刚开始我的索引包含文档中的很多字段,以防我会使用到他们。不要犯同样的错误。我有一个很小集合的索引(大约1 千万记录)增长到超过 17GB 的空间,比集合本身还大。你应该不会想要索引一个包含成百上千个实体的列表字段。 MongoDB 采用了非常有意思的方式来实现 NoSQL:采用 BSON 作为存储,JSON 作为展示,JavaScript 用
5、于管理和 Map/Reduce。因此也引起了一些小问题比如这个 (破坏了Number 和 Long 的相等操作),在 MongoDB 逐渐流行之后,可能会不断的展示出来。MongoDB, 命令行与驱动MongoDB 基本是使用 JavaScript 客户端命令行程序来进行复杂任务管理的,如数据整合和简单信息处理,编程都是完全使用 JavaScript 语言来的。本文中,我们会展示命令行的使用示例。现在有大量的 MongoDB 客户端产品提供,并且由 MongoDB 社区来支持驱动。通常每种编程语言都有驱动,并且所有流行的语言都有包括,一些不那么流行的也包含在内。这篇文章展示了使用 MongoD
6、B 的 Java 驱动,并使用一个 ORM 库(MJORM)与之进行比较。介绍 MJORM: MongoDB 的 ORM 方案在解决的众多有意思的问题中,最近 NoSQL 数据存储在开发者中主要的问题趋势就是对象关系映射。对象关系映射就是将传统中保存在关系型数据库中的持久化数据映射为在应用程序中使用的对象。这使得编程语言使用起来更加流畅和自然。MongoDB 面向文档的架构使得它非常适合对象关系映射,因为文档本身就是以对象形式存储的。可惜没有太多的 MongoDB 的 Java 对象关系映射库,但是还是有一些,如morphia-(A type-safe Java library for Mon
7、goDB), spring-data(SpringData 项目的MongoDB 实现)这些 ORM 库大量使用了注解,因为一些原因对我不适合,其中最重要的就是这些被注解的对象在多个项目中的兼容性问题。这让我开始了 mongo-Java-orm 或者 “MJORM” (发音 me-yorm)项目,一个 MongoDB 的 Java 对象关系映射项目。MJORM 是在 MIT 许可之下,并且在发布在了 google code project。项目采用 maven 构建,并且 maven 构件仓库托管于 google code 版本控制服务器。MJORM 的最新可用发布版本为 0.15,已经由一些
8、项目使用与生产环境中。开始使用开始使用 ORMORM加入加入 MJORMMJORM 库库Maven 的使用者首先应当在 pom.xml 中加入 MJORM 的 maven 仓库,使得 MJORM 构件可用。1. 2. mjorm-webdav-maven-repo 3. mjorm maven repository 4. http:/mongo-Java- 5. default 6. 然后加入依赖:1. 2. com.googlecode 3. mongo-Java-orm 4. 0.15 5. 这样就可以在应用中引入 MJORM 代码。假如没有使用 maven,则你需要手动下载 MJORM的
9、 pom.xml 中列举的所有依赖。 建立 POJOs 依赖已经导入,可以开始编码了。我们从POJO 开始:1. class Author 2. private String firstName; 3. private String lastName; 4. / . setters and getters . 5. 6. 7. class Book 8. private String id; 9. private String isbn; 10. private String title; 11. private String description; 12. private Author a
10、uthor; 13. / . setters and getters . 14. 我们在这个对象模型中的描述是,作者有 ID、姓和名,书有 ID、ISNB、标题、描述和作者。 你可能注意到书的 id 属性是一个字符串,这是为了适应 MongoDB 的对象 ID 类型。MongoDB 的 ID 是一个 12 字节的二进制值显示为一个十六进制的字符串。MongoDB 要求集合中的每个文档都必须有一个唯一 id,但不要求一定要是 ObjectId。目前 MJORM 只支持ObjectId,并且显示为字符串。 你也可能注意到了 Author 没有 id 字段。这是因为 Book是它的父文档,因此不需要
11、有 id。记住,MongoDB 只要求集合中的文档在根级别的 id。 创建 XML 映射文件 下一个步骤就是建立 XML 映射文件,MJORM 能够将 MongoDB 文档转换为对象。我们为每个文档创建一个对象作为示范,无论将所有的映射放在一个 XML 文件中还是分开都是可以的。Author.mjorm.xml:1. 2. 3. 4. 5. 6. 7. Book.mjorm.xml:1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 这些映射文件能够很好的自解释。descriptors 元素是根元素,必须包含在每个映射文件中。在它下面是 object 元素定义了文档与之对应的类。Ob
12、ject 包含的 property 元素主要用于描述 POJO 中的属性以及这些属性如何与 MongoDB 中的文档想对应。property 元素至少必须包含一个 name 属性,这个元素就是 POJO 和 MongoDB 的文档中的属性名称。column 属性则是可选的,用于特定一个在 MongoDB 文档中的可选属性名称。 property 元素当中的 id 属性应该是对象的唯一识别。一个对象只能有一个 property 元素包含 id 属性。auto 的设置会使得 MJORM 在持久化时为该属性自动生成一个值。 可以在 google code 的 MJORM 项目主页中查看 XML 映射
13、文件的更多细节描述。 整合 POJO 与 XML 我们创建了数据模型以及映射文件,使得 MJORM 可以从 MongoDB 序列号以及反序列号 POJO。我们可以进行一些有意思的事情了,首先打开 MongoDB 的链接:1. Mongo mongo = new Mongo( 2. new MongoURI(“mongodb:/localhost/mjormIsFun“); / 10gen driver Mongo 对象是由 10gen 编写的 Java 驱动提供的。示例中连接了一个本地的 MongoDB 实例中的 mjormIsFun 数据库。接下来我们创建 MJORM ObjectMappe
14、r 。目前 ObjectMapper 在 MJORM 中的唯一实现就是 XmlDescriptorObjectMapper,使用 XML 结构描述信息。可能之后会增加对注解或其他结构定义的支持。1. XmlDescriptorObjectMapper objectMapper = new XmlDescriptorObjectMapper(); 2. mapper.addXmlObjectDescriptor(new File(“Book.mjorm.xml“); 3. mapper.addXmlObjectDescriptor(new File(“Author.mjorm.xml“); 建立
15、好了 XmlDescriptorObjectMapper 并且加入了映射文件。接下来建立由 MJORM 提供的 MongoDao 对象的实例。1. DB db = mongo.getDB(“mjormIsFun“); / 10gen driver 2. MongoDao dao = new MongoDaoImpl(db, objectMapper); 首先我们要获得 10gen 驱动提供的 DB 对象实例。然后使用 DB 和 ObjectMapper 建立MongoDao 。我们准备开始持久化数据,建立一个 Book 然后保存到 MongoDB 中。1. Book book = new Book(); 2. book.setIsbn(“1594743061“); 3. book.setTitle(“MongoDB is fun“); 4. book.setDescription(“.“); 5. book = dao.createObject(“books“, book)