MongoDB、Java与对象关系映射

c#小王子 c#小王子 2022-03-18 518 Java

当今NoSQL领域中有很多有力的竞争者通过多种方式来处理海量数据问题。其中重要的解决方案之一就是MongoDB。MongoDB是面向文档的弱结构化存储方案,使用JSON格式来展现、查询和修改数据。

AD:

MongoDB介绍

当今NoSQL领域中有很多有力的竞争者通过多种方式来处理海量数据问题。其中重要的解决方案之一就是MongoDB。MongoDB是面向文档的弱结构化存储方案,使用JSON格式来展现、查询和修改数据。


MongoDB文档相当完备,扩展规模与安装一样简单。它提供冗余、切片、索引以及map/reduce等概念支持。MongoDB的开源社区非常大且非常活跃。MongoDB在很多大型产品中被实际运用,如:Disney, Craigslist, Foursquare, Github 和SourceForge。MongoDB是一个开源项目,由10gen.com建立并维护,该公司由DoubleClick的前任执行人员创立。同时,10gen也提供了极好的商业支持与参与建设。


MongoDB 与 NoSQL: 缺陷与优势


MongoDB作为一个可用NoSQL方案具有很多优势。我刚开始接触nosql数据库了解了一系列基于Java的方案,并且花了大量的时间来弄懂什么是列家族,Hadoop与HBase的关系,ZooKeeper到底是什么。当我终于全部清楚之后,发现Cassandra与HBase确实是对于NoSQL领域非常可靠、可信赖的解决方案。但与其他的解决方案相比,MongoDB让我在能够开始写代码之前,不用理解那么多的概念。


与其他软件相似,MongoDB也存在缺陷。经过一段时间使用MongoDB,我列举经历过并需要注意的一些事情,我成为“Gotchas”:


● 不要按照关系型数据库来思考。这很明显,MongoDB使得构建和执行复杂查询变得非常容易。当实际使用的时候,你会主要关注于效率问题(像我一样)。

● MongoDB的索引是二进制的树。如果你不是很熟悉B-tree,可能需要了解一下。这些都涉及到构建符合提供查询条件需求的建立索引的方式。

● 小心的设计索引结构。这涉及到上面提到的B-tree。刚开始我的索引包含文档中的很多字段,以防我会使用到他们。不要犯同样的错误。我有一个很小集合的索引(大约1千万记录)增长到超过17GB的空间,比集合本身还大。你应该不会想要索引一个包含成百上千个实体的列表字段。

● MongoDB采用了非常有意思的方式来实现NoSQL:采用BSON作为存储,JSON作为展示,JavaScript用于管理和Map/Reduce。因此也引起了一些小问题比如这个 (破坏了Number和Long的相等操作),在MongoDB逐渐流行之后,可能会不断的展示出来。


MongoDB, 命令行与驱动

MongoDB基本是使用JavaScript客户端命令行程序来进行复杂任务管理的,如数据整合和简单信息处理,编程都是完全使用JavaScript语言来的。本文中,我们会展示命令行的使用示例。现在有大量的MongoDB客户端产品提供,并且由MongoDB社区来支持驱动。通常每种编程语言都有驱动,并且所有流行的语言都有包括,一些不那么流行的也包含在内。这篇文章展示了使用MongoDB的Java驱动,并使用一个ORM库(MJORM)与之进行比较。


介绍 MJORM: MongoDB的ORM方案

在解决的众多有意思的问题中,最近NoSQL数据存储在开发者中主要的问题趋势就是对象关系映射。对象关系映射就是将传统中保存在关系型数据库中的持久化数据映射为在应用程序中使用的对象。这使得编程语言使用起来更加流畅和自然。


MongoDB面向文档的架构使得它非常适合对象关系映射,因为文档本身就是以对象形式存储的。可惜没有太多的MongoDB的Java对象关系映射库,但是还是有一些,如morphia-(A type-safe Java library for MongoDB), 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,已经由一些项目使用与生产环境中。


开始使用ORM


加入MJORM 库


Maven的使用者首先应当在pom.xml中加入MJORM的maven仓库,使得MJORM构件可用。


1. <repository>  
2.     <id>mjorm-webdav-maven-repo</id>  
3.     <name>mjorm maven repository</name>  
4.     <url>http://mongo-Java-orm.googlecode.com/svn/maven/repo/</url>  
5.     <layout>default</layout>  
6. </repository> 


然后加入依赖:


1. <dependency>  
2.     <groupId>com.googlecode</groupId>  
3.     <artifactId>mongo-Java-orm</artifactId>  
4.     <version>0.15</version>  
5. </dependency> 


这样就可以在应用中引入MJORM代码。假如没有使用maven,则你需要手动下载MJORM的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 author;  
13.     // ... setters and getters ...  
14. } 


我们在这个对象模型中的描述是,作者有ID、姓和名,书有ID、ISNB、标题、描述和作者。 你可能注意到书的id属性是一个字符串,这是为了适应MongoDB的对象ID类型。MongoDB的ID是一个12字节的二进制值显示为一个十六进制的字符串。MongoDB要求集合中的每个文档都必须有一个唯一id,但不要求一定要是ObjectId。目前MJORM只支持ObjectId,并且显示为字符串。 你也可能注意到了Author没有id字段。这是因为Book是它的父文档,因此不需要有id。记住,MongoDB只要求集合中的文档在根级别的id。 创建XML映射文件 下一个步骤就是建立XML映射文件,MJORM能够将MongoDB文档转换为对象。我们为每个文档创建一个对象作为示范,无论将所有的映射放在一个XML文件中还是分开都是可以的。

Author.mjorm.xml:


1. <?xml version="1.0"?> 
2. <descriptors> 
3.          <object> 
4.                  <property name="firstName" /> 
5.                  <property name="lastName" /> 
6.          </object> 
7. </descriptors> 

	Book.mjorm.xml:
1. <?xml version="1.0"?> 
2. <descriptors> 
3.          <object> 
4.                  <property name="id" id="true" auto="true" /> 
5.                  <property name="isbn" /> 
6.                  <property name="title" /> 
7.                  <property name="description" /> 
8.                  <property name="author" /> 
9.          </object> 
10. </descriptors> 


这些映射文件能够很好的自解释。descriptors 元素是根元素,必须包含在每个映射文件中。在它下面是object元素定义了文档与之对应的类。


Object包含的property 元素主要用于描述POJO中的属性以及这些属性如何与MongoDB中的文档想对应。property 元素至少必须包含一个name 属性,这个元素就是POJO和MongoDB的文档中的属性名称。column 属性则是可选的,用于特定一个在MongoDB文档中的可选属性名称。 property 元素当中的id属性应该是对象的唯一识别。一个对象只能有一个property 元素包含id属性。auto 的设置会使得MJORM在持久化时为该属性自动生成一个值。 可以在google code的MJORM项目主页中查看XML映射文件的更多细节描述。 整合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 ObjectMapper 。目前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")); 


建立好了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);  
6. System.out.println(book.getId()); // 4f96309f762dd76ece5a9595 


首先建立Book 对象并且填值,然后调用MongoDao 的 createObject 方法,将Book 对象传入”books” 的集合中。MJORM会按照之前的xml映射文件将Book 转换为DBObject (这是10gen的Java驱动使用的基本类型),并保存一个新的文档进”books” 集合。MJORM返回Book对象时,id属性会被填充。请注意,MongoDB默认是不需要在使用前建立数据库或集合的,系统会在需要时自动创建,这可能会造成某些困扰。在MongoDB的命令行中查看Book对象大概如下:


1. > db.books.find({_id:ObjectId("4f96309f762dd76ece5a9595")}).pretty()  
2. {  
3.          "_id":          ObjectId("4f96309f762dd76ece5a9595"),  
4.          "isbn":         "1594743061",  
5.          "title":        "MongoDB is fun",  
6.          "description":  "..." 
7. } 


我们来看看假如不用MJORM而直接使用10gen的Java驱动,如何使用createObject 方法:


1. Book book = new Book();  
2. book.setIsbn("1594743061");  
3. book.setTitle("MongoDB is fun");  
4. book.setDescription("...");  
5. DBObject bookObj = BasicDBObjectBuilder.start()  
6.          .add("isbn",              book.getIsbn())  
7.          .add("title",             book.getTitle())  
8.          .add("description",       book.getDescription())  
9.          .get();  
10. // 'db' is our DB object from earlier  
11. DBCollection col = db.getCollection("books");  
12. col.insert(bookObj);  
13. ObjectId id = ObjectId.class.cast(bookObj.get("_id"));  
14. System.out.println(id.toStringMongod()); // 4f96309f762dd76ece5a9595 


下面进行对象的查询:


1. Book book = dao.readObject("books", "4f96309f762dd76ece5a9595", Book.class);  
2. System.out.println(book.getTitle()); // "MongoDB is fun" 


readObject 方法根据给定文档的id从指定的集合中读取文档,转换为对象(再次使用映射文件)并返回。 敏锐的读者会注意到Book还没有指定Author,仍然保存了。这归咎于MongoDB的结构不敏感的特性。我们不能要求集合中的文档包含所有属性(id属性是必须的),所有在MongoDB中没有Author的Book是可以的。我们现在为Book添加一个Author并且更新一下:


1. Author author = new Author();  
2. author.setFirstName("Brian");  
3. author.setLastName("Dilley");  
4. book.setAuthor(author);  
5. dao.updateObject("books", "4f96309f762dd76ece5a9595", book); 


现在Book就包含了Author,并且在MongoDB中持久化了。现在在命令行查看了Book:


1. > db.books.find({_id:ObjectId("4f96309f762dd76ece5a9595")}).pretty()  
2. {  
3.          "_id":          ObjectId("4f96309f762dd76ece5a9595"),  
4.          "isbn":         "1594743061",  
5.          "title":        "MongoDB is fun",  
6.          "description":  "..." 
7.          "author": {  
8.              "firstName": "Brian",  
9.              "lastName": "Dilley" 
10.          }  
11. } 


可以看到持久化的Book中已经包含了author。不使用MJORM来操作一遍:


1. Author author = new Author();  
2. author.setFirstName("Brian");  
3. author.setLastName("Dilley");  
4. book.setAuthor(author);  
5. DBObject bookObj = BasicDBObjectBuilder.start()  
6.          .add("isbn",              book.getIsbn())  
7.          .add("title",             book.getTitle())  
8.          .add("description",       book.getDescription())  
9.          .push("author")  
10.                  .add("firstName",         author.getFirstName())  
11.                  .add("lastName",  author.getLastName())  
12.                  .pop()  
13.          .get();  
14. DBCollection col = db.getCollection("books");  
15. col.update(new BasicDBObject("_id", bookObj.get("_id")), bookObj); 


对于MongoDao 方法的深入讨论已经超出了本文的范围。对于将MJORM有兴趣用于实际项目中的用户强烈建议了解一下MJORM项目提供的相关文档,或者MongoDao 接口提供的相关用法。


【下载地址】

百度网盘链接:https://pan.baidu.com/s/1iTgu6Ub0bi3-XiB2Z74KwA

提取码:r6ch


相关文章


使用-JFreeChart来创建基于web的图表

使用-JFreeChart来创建基于web的图表

XStream使用文档

XStream使用文档

WebService发布过程及常见问题

WebService发布过程及常见问题

webpack实战入门进阶调优分享

webpack实战入门进阶调优分享

weblogic调优参数及监控指标

weblogic调优参数及监控指标

weblogic节点管理

weblogic节点管理

weblogic管理控制台概述

weblogic管理控制台概述

weblogic-部署和启动

weblogic-部署和启动

WebLogic-Server-性能及调优-调优-Java-虚拟机

Java 虚拟机(Java virtual machine,简称 JVM)是一种虚拟“执行引擎”实例,可在微处理器上执行 Java 类文件中的字节码。调整 JVM 的方式会影响 Weblogic Server 和应用程序的性能。

Velocity用户教程

Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。

Velocity用户手册

Velocity 用户手册是帮助页面设计者和内容提供者认识 Velocity 和其简单而功能强大的脚本语言――Velocity 模板语言(VTL)。在手册上的许多例子,都是用 Velocity 插入动态的内容到网页上,但是所有的 VLT 例子都能应用到其他的页面和模板中。


文章热度: 166291
文章数量: 333
推荐阅读

FlashFXP绿色版网盘下载,附激活教程 908

FlashFxp百度网盘下载链接:https://pan.baidu.com/s/1MBQ5gkZY1TCFY8A7fnZCfQ。FlashFxp是功能强大的FTP工具

Adobe Fireworks CS6 Ansifa绿色精简版网盘下载 629

firework可以制作精美或是可以闪瞎眼的gif,这在广告领域是需要常用的,还有firework制作下logo,一些原创的图片还是很便捷的,而且fireworks用法简单,配合dw在做网站这一块往往会发挥出很强大的效果。百度网盘下载链接:https://pan.baidu.com/s/1fzIZszfy8VX6VzQBM_bdZQ

navicat for mysql中文绿色版网盘下载 599

Navicat for Mysql是用于Mysql数据库管理的一款图形化管理软件,非常的便捷和好用,可以方便的增删改查数据库、数据表、字段、支持mysql命令,视图等等。百度网盘下载链接:https://pan.baidu.com/s/1T_tlgxzdQLtDr9TzptoWQw 提取码:y2yq

火车头采集器(旗舰版)绿色版网盘下载 1018

火车头采集器是站长常用的工具,相比于八爪鱼,简洁好用,易于配置。火车头能够轻松的抓取网页内容,并通过自带的工具对内容进行处理。站长圈想要做网站,火车头采集器是必不可少的。百度网盘链接:https://pan.baidu.com/s/1u8wUqS901HgOmucMBBOvEA

Photoshop(CS-2015-2023)绿色中文版软件下载 1349

安装文件清单(共46G)包含Window和Mac OS各个版本的安装包,从cs到cc,从绿色版到破解版,从安装文件激活工具,应有尽有,一次性打包。 Photoshop CC绿色精简版 Photoshop CS6 Mac版 Photoshop CC 2015 32位 Photoshop CC 2015 64位 Photoshop CC 2015 MAC版 Photoshop CC 2017 64位 Adobe Photoshop CC 2018 Adobe_Photoshop_CC_2018 Photoshop CC 2018 Win32 Photoshop CC 2018 Win64

知之

知之平台是全球领先的知识付费平台。提供各个领域的项目实战经验分享,提供优质的行业解决方案信息,来帮助您的工作和学习

使用指南 建议意见 用户协议 友情链接 隐私政策 Powered by NOOU ©2020 知之