﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-云-随笔分类-NoSQL</title><link>http://www.blogjava.net/matuobasyouca/category/51647.html</link><description>敏捷、分布式、ALM过程自动化、企业应用架构</description><language>zh-cn</language><lastBuildDate>Wed, 09 May 2012 05:58:35 GMT</lastBuildDate><pubDate>Wed, 09 May 2012 05:58:35 GMT</pubDate><ttl>60</ttl><item><title>MongoDB, Java 与对象关系映射</title><link>http://www.blogjava.net/matuobasyouca/archive/2012/05/09/377698.html</link><dc:creator>一酌散千忧</dc:creator><author>一酌散千忧</author><pubDate>Wed, 09 May 2012 05:46:00 GMT</pubDate><guid>http://www.blogjava.net/matuobasyouca/archive/2012/05/09/377698.html</guid><wfw:comment>http://www.blogjava.net/matuobasyouca/comments/377698.html</wfw:comment><comments>http://www.blogjava.net/matuobasyouca/archive/2012/05/09/377698.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/matuobasyouca/comments/commentRss/377698.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/matuobasyouca/services/trackbacks/377698.html</trackback:ping><description><![CDATA[<div>  <h2><span style="font-size:14.5pt;font-family:Arial;color:black;letter-spacing:-.75pt">MongoDB</span><span><span style="font-size:14.5pt;color:black;letter-spacing:-.75pt">介绍</span></span><span></span></h2>  <p><span>当今<span>NoSQL领域中有很多有力的竞争者通过多种方式来处理海量数据问题。其中重要的解决方案之一就是MongoDB。MongoDB是面向文档的弱结构化存储方案，使用JSON格式来展现、查询和修改数据。</span></span></p>  <p><span><span>MongoDB文档相当完备，扩展规模与安装一样简单。它提供冗余、切片、索引以及map/reduce等概念支持。MongoDB的开源社区非常大且非常活跃。MongoDB在很多大型产品中被实际运用，如：Disney, Craigslist, Foursquare, Github 和SourceForge。MongoDB是一个开源项目，由</span></span><a href="http://www.10gen.com/"><span><span style="color:#0B59B2">10gen.com</span></span></a><span>建立并维护，该公司由<span>DoubleClick的前任执行人员创立。同时，10gen也提供了极好的商业支持与参与建设。</span></span></p>  <h2><span><span><span style="font-size:14.5pt; font-family:Arial;color:black;letter-spacing:-.75pt">MongoDB </span></span></span><span><span style="font-size:14.5pt;color:black;letter-spacing:-.75pt">与</span></span><span><span><span style="font-size:14.5pt;font-family:Arial;color:black;letter-spacing: -.75pt"> NoSQL: </span></span></span><span><span><span style="font-size:14.5pt;color:black; letter-spacing:-.75pt">缺陷与优势</span></span></span><span></span></h2>  <p><span><span>MongoDB作为一个可用NoSQL方案具有很多优势。我刚开始接触NoSQL数据库了解了一系列基于Java的方案，并且花了大量的时间来弄懂什么是列家族，Hadoop与HBase的关系，ZooKeeper到底是什么。当我终于全部清楚之后，发现Cassandra与HBase确实是对于NoSQL领域非常可靠、可信赖的解决方案。但与其他的解决方案相比，MongoDB让我在能够开始写代码之前，不用理解那么多的概念。</span></span></p>  <p><span>与其他软件相似，<span>MongoDB也存在缺陷。经过一段时间使用MongoDB，我列举经历过并需要注意的一些事情，我成为&#8220;Gotchas&#8221;：</span></span></p>  <ul type="disc"><li style="      text-align:left;"><span><span style="font-family:宋体;">不要按照关系型数据库来思考。这很明显，MongoDB</span></span><span><span style="font-family:宋体;">使得构建和执行复杂查询变得非常容易。当实际使用的时候，你会主要关注于效率问题（像我一样）。</span></span></li><li style="      text-align:left;"><span><span>MongoDB</span></span><span><span style="font-family:宋体;">的索引是二进制的树。如果你不是很熟悉B-tree</span></span><span><span style="font-family:宋体;">，可能需要了解一下。这些都涉及到构建符合提供查询条件需求的建立索引的方式。</span></span></li><li style="      text-align:left;"><span><span style="font-family:宋体;">小心的设计索引结构。这涉及到上面提到的B-tree</span></span><span><span style="font-family:宋体;">。刚开始我的索引包含文档中的很多字段，以防我会使用到他们。不要犯同样的错误。我有一个很小集合的索引（大约1</span></span><span><span style="font-family:宋体;">千万记录）增长到超过17GB</span></span><span><span style="font-family:宋体;">的空间，比集合本身还大。你应该不会想要索引一个包含成百上千个实体的列表字段。</span></span></li><li style="      text-align:left;"><span><span>MongoDB</span></span><span><span style="font-family:宋体;">采用了非常有意思的方式来实现NoSQL</span></span><span><span style="font-family:宋体;">：采用BSON</span></span><span><span style="font-family:宋体;">作为存储，JSON</span></span><span><span style="font-family:宋体;">作为展示，JavaScript</span></span><span><span style="font-family:宋体;">用于管理和Map/Reduce</span></span><span><span style="font-family:宋体;">。因此也引起了一些小问题比如</span></span><a href="https://jira.mongodb.org/browse/SERVER-1672"><span><span><span style="font-family:      宋体;color:#0B59B2">这个</span></span></span></a><span> </span><span><span style="font-family:宋体;">（破坏了Number</span></span><span><span style="font-family:宋体;">和Long</span></span><span><span style="font-family:宋体;">的相等操作），在MongoDB</span></span><span><span style="font-family:宋体;">逐渐流行之后，可能会不断的展示出来。</span></span></li></ul>  <p><span>&nbsp;</span></p>  <h2><span><span><span style="font-size:14.5pt; font-family:Arial;color:black;letter-spacing:-.75pt">MongoDB, </span></span></span><span><span style="font-size:14.5pt;color:black;letter-spacing:-.75pt">命令行与驱动</span></span><span></span></h2>  <p><span><span>MongoDB基本是使用JavaScript客户端命令行程序来进行复杂任务管理的，如数据整合和简单信息处理，编程都是完全使用JavaScript语言来的。本文中，我们会展示命令行的使用示例。现在有大量的MongoDB客户端产品提供，并且由MongoDB社区来支持驱动。通常每种编程语言都有驱动，并且所有流行的语言都有包括，一些不那么流行的也包含在内。这篇文章展示了使用MongoDB的Java驱动，并使用一个ORM库（MJORM）与之进行比较。</span></span></p>  <h2><span><span><span style="font-size:14.5pt;color:black; letter-spacing:-.75pt">介绍</span></span></span><span><span><span style="font-size:14.5pt; font-family:Arial;color:black;letter-spacing:-.75pt"> MJORM: MongoDB</span></span></span><span><span style="font-size:14.5pt;color:black;letter-spacing:-.75pt">的</span></span><span><span><span style="font-size:14.5pt;font-family:Arial;color:black;letter-spacing: -.75pt">ORM</span></span></span><span><span><span style="font-size:14.5pt;color:black; letter-spacing:-.75pt">方案</span></span></span><span></span></h2>  <p><span>在解决的众多有意思的问题中，最近<span>NoSQL数据存储在开发者中主要的问题趋势就是对象关系映射。对象关系映射就是将传统中保存在关系型数据库中的持久化数据映射为在应用程序中使用的对象。这使得编程语言使用起来更加流畅和自然。</span></span></p>  <p><span><span>MongoDB面向文档的架构使得它非常适合对象关系映射，因为文档本身就是以对象形式存储的。可惜没有太多的MongoDB的Java对象关系映射库，但是还是有一些，如</span></span><a href="http://code.google.com/p/morphia/"><span><span><span style="color:#0B59B2">morphia-(A type-safe Java library for MongoDB)</span></span></span></a><span>，<span>&nbsp;</span></span><a href="http://www.springsource.org/spring-data/mongodb"><span><span style="color:#0B59B2">spring-data</span></span></a><span><span>(SpringData项目的MongoDB实现)</span></span><span></span></p>  <p><span>这些<span>ORM库大量使用了注解，因为一些原因对我不适合，其中最重要的就是这些被注解的对象在多个项目中的兼容性问题。这让我开始了mongo-Java-orm 或者 "MJORM" (发音 me-yorm)项目，一个MongoDB的Java对象关系映射项目。MJORM是在MIT许可之下，并且在发布在了</span></span><a href="http://code.google.com/p/mongo-Java-orm/"><span><span><span style="color:#0B59B2">google code project</span></span></span></a><span>。项目采用<span>maven构建，并且maven构件仓库托管于google code版本控制服务器。MJORM的最新可用发布版本为0.15，已经由一些项目使用与生产环境中。</span></span></p>  <h2><span><span><span style="font-size:14.5pt;color:black; letter-spacing:-.75pt">开始使用</span></span></span><span><span><span style="font-size:14.5pt; font-family:Arial;color:black;letter-spacing:-.75pt">ORM</span></span></span></h2>  <h3><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">加入</span></span></span><span><span><span style="font-size:11.5pt; line-height:173%;font-family:Arial;letter-spacing:-.75pt">MJORM </span></span></span><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">库</span></span></span><span></span></h3>  <p><span><span>Maven的使用者首先应当在pom.xml中加入MJORM的maven仓库，使得MJORM构件可用。</span></span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&lt;repository&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;mjorm-webdav-maven-repo&lt;/id&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;mjorm maven repository&lt;/name&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;http://mongo-Java-orm.googlecode.com/svn/maven/repo/&lt;/url&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;layout&gt;default&lt;/layout&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&lt;/repository&gt;</span></span></span></pre></div>  <p><span>然后加入依赖<span>:</span></span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&lt;dependency&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;com.googlecode&lt;/groupId&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;mongo-Java-orm&lt;/artifactId&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;0.15&lt;/version&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&lt;/dependency&gt;</span></span></span></pre></div>  <p><span>这样就可以在应用中引入<span>MJORM代码。假如没有使用maven，则你需要手动下载MJORM的pom.xml中列举的所有依赖。</span></span></p>  <h3><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">建立</span></span></span><span><span><span style="font-size:11.5pt; line-height:173%;font-family:Arial;letter-spacing:-.75pt"> POJOs</span></span></span></h3>  <p><span>依赖已经导入，可以开始编码了。我们从<span>POJO开始:</span></span><span></span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span>&nbsp;</span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">class Author {</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String firstName;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String lastName;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ... setters and getters ...</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">}</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span>&nbsp;</span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">class Book {</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String id;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String isbn;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String title;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String description;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Author author;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ... setters and getters ...</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">}</span></span></span></pre></div>  <p><span>我们在这个对象模型中的描述是，作者有<span>ID、姓和名，书有ID、ISNB、标题、描述和作者。</span></span></p>  <p><span>你可能注意到书的<span>id属性是一个字符串，这是为了适应MongoDB的对象ID类型。MongoDB的ID是一个12字节的二进制值显示为一个十六进制的字符串。MongoDB要求集合中的每个文档都必须有一个唯一id，但不要求一定要是ObjectId。目前MJORM只支持ObjectId，并且显示为字符串。</span></span></p>  <p><span>你也可能注意到了<span>Author没有id字段。这是因为Book是它的父文档，因此不需要有id。记住，MongoDB只要求集合中的文档在根级别的id。</span></span></p>  <h3><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">创建</span></span></span><span><span><span style="font-size:11.5pt; line-height:173%;font-family:Arial;letter-spacing:-.75pt">XML</span></span></span><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">映射文件</span></span></span><span></span></h3>  <p><span>下一个步骤就是建立<span>XML映射文件，MJORM能够将MongoDB文档转换为对象。我们为每个文档创建一个对象作为示范，无论将所有的映射放在一个XML文件中还是分开都是可以的。</span></span></p>  <p><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">Author.mjorm.xml</span></code>:</span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&lt;?xml version="1.0"?&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&lt;descriptors&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;object class="Author"&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="firstName" /&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="lastName" /&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/object&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&lt;/descriptors&gt;</span></span></span></pre></div>  <p><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">Book.mjorm.xml</span></code>:</span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&lt;?xml version="1.0"?&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&lt;descriptors&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;object class="Book"&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="id" id="true" auto="true" /&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="isbn" /&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="title" /&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="description" /&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="author" /&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/object&gt;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&lt;/descriptors&gt;</span></span></span></pre></div>  <p><span>&nbsp;</span></p>  <p><span>这些映射文件能够很好的自解释。</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">descriptors</span></code>&nbsp;元素是根元素，必须包含在每个映射文件中。在它下面是</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">object</span></code>元素定义了文档与之对应的类。</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">Object</span></code></span><span><code><span style="font-size:9.0pt;Courier New&quot;;Courier New&quot;;Courier New&quot;">包含的</span></code></span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">property</span></code>&nbsp;元素主要用于描述<span>POJO中的属性以及这些属性如何与MongoDB中的文档想对应。</span></span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">property</span></code>&nbsp;元素至少必须包含一个</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">name</span></code>&nbsp;属性，这个元素就是POJO和MongoDB的文档中的属性名称。</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">column</span></code>&nbsp;属性则是可选的，用于特定一个在MongoDB文档中的可选属性名称。</span></p>  <p><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">property</span></code>&nbsp;元素当中的<span>id属性应该是对象的唯一识别。一个对象只能有一个</span></span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">property</span></code>&nbsp;元素包含<span>id属性。</span></span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">auto</span></code>&nbsp;的设置会使得MJORM在持久化时为该属性自动生成一个值。</span></p>  <p><span>可以在<span>google code的MJORM项目主页中查看XML映射文件的更多细节描述。</span></span></p>  <h3><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">整合</span></span></span><span><span><span style="font-size:11.5pt; line-height:173%;font-family:Arial;letter-spacing:-.75pt">POJO</span></span></span><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">与</span></span></span><span><span><span style="font-size:11.5pt; line-height:173%;font-family:Arial;letter-spacing:-.75pt">XML</span></span></span></h3>  <p><span>我们创建了数据模型以及映射文件，使得<span>MJORM可以从MongoDB序列号以及反序列号POJO。我们可以进行一些有意思的事情了，首先打开MongoDB的链接：</span></span><span></span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">Mongo mongo = new Mongo(</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new MongoURI("mongodb://localhost/mjormIsFun")); // 10gen driver</span></span></span></pre></div>  <p><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">Mongo</span></code>&nbsp;对象是由10gen编写的Java驱动提供的。示例中连接了一个本地的MongoDB实例中的mjormIsFun数据库。接下来我们创建MJORM </span><span><span><code><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;">ObjectMapper </span></code>。目前</span></span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">ObjectMapper </span></code>在MJORM中的唯一实现就是</span><span><span><code><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;">XmlDescriptorObjectMapper</span></code>，使用XML结构描述信息。可能之后会增加对注解或其他结构定义的支持。</span></span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">XmlDescriptorObjectMapper objectMapper = new XmlDescriptorObjectMapper();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">mapper.addXmlObjectDescriptor(new File("Book.mjorm.xml"));</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">mapper.addXmlObjectDescriptor(new File("Author.mjorm.xml"));</span></span></span></pre></div>  <p><span>建立好了</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">XmlDescriptorObjectMapper</span></code>&nbsp;并且加入了映射文件。接下来建立由MJORM提供的</span><span><span><code><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;">MongoDao</span></code>&nbsp;对象的实例。</span></span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">DB db = mongo.getDB("mjormIsFun"); // 10gen driver</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">MongoDao dao = new MongoDaoImpl(db, objectMapper);</span></span></span></pre></div>  <p><span>首先我们要获得<span>10gen驱动提供的DB对象实例。然后使用DB和</span></span><span><span><code><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;">ObjectMapper</span></code>&nbsp;建立</span></span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">MongoDao</span></code>&nbsp;。我们准备开始持久化数据，建立一个</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">Book</span></code>&nbsp;然后保存到MongoDB中。</span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">Book book = new Book();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">book.setIsbn("1594743061");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">book.setTitle("MongoDB is fun");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">book.setDescription("...");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span>&nbsp;</span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">book = dao.createObject("books", book);</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">System.out.println(book.getId()); // 4f96309f762dd76ece5a9595</span></span></span></pre></div>  <p><span>首先建立</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">Book</span></code>&nbsp;对象并且填值，然后调用</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">MongoDao</span></code>&nbsp;的</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;"> createObject</span></code>&nbsp;方法，将</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">Book</span></code>&nbsp;对象传入"</span><span><span><code><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;">books</span></code>" 的集合中。MJORM会按照之前的xml映射文件将</span></span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">Book</span></code>&nbsp;转换为</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">DBObject</span></code>&nbsp;(这是10gen的Java驱动使用的基本类型)，并保存一个新的文档进"</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">books</span></code>" 集合。MJORM返回Book对象时，id属性会被填充。请注意，MongoDB默认是不需要在使用前建立数据库或集合的，系统会在需要时自动创建，这可能会造成某些困扰。在MongoDB的命令行中查看Book对象大概如下：</span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&gt; db.books.find({_id:ObjectId("4f96309f762dd76ece5a9595")}).pretty()</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">{</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "_id":&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectId("4f96309f762dd76ece5a9595"),</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "isbn":&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "1594743061",</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "title":&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MongoDB is fun",</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "description":&nbsp;"..."</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">}</span></span></span></pre></div>  <p><span>&nbsp;</span></p>  <p><span>我们来看看假如不用<span>MJORM而直接使用10gen的Java驱动，如何使用</span></span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">createObject</span></code>&nbsp;方法：</span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">Book book = new Book();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">book.setIsbn("1594743061");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">book.setTitle("MongoDB is fun");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">book.setDescription("...");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span>&nbsp;</span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">DBObject bookObj = BasicDBObjectBuilder.start()</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add("isbn", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book.getIsbn())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add("title",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book.getTitle())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add("description",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book.getDescription())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .get();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span>&nbsp;</span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">// 'db' is our DB object from earlier</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">DBCollection col = db.getCollection("books");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">col.insert(bookObj);</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span>&nbsp;</span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">ObjectId id = ObjectId.class.cast(bookObj.get("_id"));</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">System.out.println(id.toStringMongod()); // 4f96309f762dd76ece5a9595</span></span></span></pre></div>  <p><span>&nbsp;</span></p>  <p><span>下面进行对象的查询<span>:</span></span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">Book book = dao.readObject("books", "4f96309f762dd76ece5a9595", Book.class);</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">System.out.println(book.getTitle()); // "MongoDB is fun"</span></span></span></pre></div>  <p><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">readObject</span></code>&nbsp;方法根据给定文档的id从指定的集合中读取文档，转换为对象（再次使用映射文件）并返回。</span></p>  <p><span>敏锐的读者会注意到<span>Book还没有指定Author，仍然保存了。这归咎于MongoDB的结构不敏感的特性。我们不能要求集合中的文档包含所有属性（id属性是必须的），所有在MongoDB中没有Author的Book是可以的。我们现在为Book添加一个Author并且更新一下：</span></span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">Author author = new Author();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">author.setFirstName("Brian");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">author.setLastName("Dilley");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span>&nbsp;</span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">book.setAuthor(author);</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span>&nbsp;</span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">dao.updateObject("books", "4f96309f762dd76ece5a9595", book);</span></span></span></pre></div>  <p><span>现在<span>Book就包含了Author，并且在MongoDB中持久化了。现在在命令行查看了Book：</span></span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&gt; db.books.find({_id:ObjectId("4f96309f762dd76ece5a9595")}).pretty()</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">{</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "_id":&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectId("4f96309f762dd76ece5a9595"),</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "isbn":&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "1594743061",</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "title":&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MongoDB is fun",</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "description":&nbsp;"..."</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "author": {</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "firstName": "Brian",</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "lastName": "Dilley"</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">}</span></span></span></pre></div>  <p><span>可以看到持久化的<span>Book中已经包含了author。不使用MJORM来操作一遍：</span></span></p>  <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">Author author = new Author();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">author.setFirstName("Brian");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">author.setLastName("Dilley");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span>&nbsp;</span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">book.setAuthor(author);</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span>&nbsp;</span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">DBObject bookObj = BasicDBObjectBuilder.start()</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add("isbn", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book.getIsbn())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add("title",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book.getTitle())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add("description",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book.getDescription())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .push("author")</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add("firstName", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; author.getFirstName())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add("lastName",  author.getLastName())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .pop()</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .get();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span>&nbsp;</span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">DBCollection col = db.getCollection("books");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:&quot;Courier New&quot;;color:#222222">col.update(new BasicDBObject("_id", bookObj.get("_id")), bookObj);</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span>&nbsp;</span></pre></div>  <p><span>&nbsp;</span></p>  <p><span>对于</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">MongoDao</span></code>&nbsp;方法的深入讨论已经超出了本文的范围。对于将MJORM有兴趣用于实际项目中的用户强烈建议了解一下MJORM项目提供的相关文档，或者</span><span><code><span style="font-size:9.0pt;font-family:&quot;Courier New&quot;">MongoDao</span></code>&nbsp;接口提供的相关用法。</span></p>  <h2><span><span><span style="font-size:14.5pt;color:black; letter-spacing:-.75pt">总结</span></span></span><span></span></h2>  <p><span>希望这篇文章对<span>MongoDB和MJORM的亮点有所展示。MongDB是一个优秀的呃NoSQL数据存储，有着大量优秀的特性，会是NoSQL市场中长期竞争者。若你会在一个Java项目中使用MongoDB，希望你也能够考虑使用MJORM作为你的ORM框架。十分欢迎大家提交特性需求、错误异常报告、文档和源码修正。</span></span></p>  <p style="line-height:12.0pt;background:white"><span>&nbsp;</span></p>  <h2><span><span style="font-size:14.5pt;color:black;letter-spacing:-.75pt">作者</span></span><span><span><span style="font-size:14.5pt;font-family:Arial;color:black;letter-spacing: -.75pt"> Bio</span></span></span></h2>  <p style="line-height:12.0pt;background:white"><span><span><strong><span style="font-size:10.0pt; font-family:Tahoma;color:black">Brian Dilley</span></strong></span></span><span><span>&nbsp;</span></span><span><span><span style="font-size:10.0pt;color:black">是一个经验丰富的高级工程师以及项目领导，在</span></span></span><span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">Java/Java EE /Spring Framework/Linux</span></span></span><span><span style="font-size:10.0pt;color:black">内部结构理解和管理有着超过</span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">13</span></span><span><span style="font-size:10.0pt;color:black">年的经验。</span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">Brian</span></span><span><span style="font-size:10.0pt;color:black">对于创业公司有很多经验，推向市场，构建</span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">/</span></span><span><span style="font-size:10.0pt;color:black">维护产品等。他是</span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">Iaas</span></span><span><span style="font-size:10.0pt;color:black">、</span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">cloud</span></span><span><span style="font-size:10.0pt;color:black">、</span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">PHP</span></span><span><span style="font-size:10.0pt;color:black">和</span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">Linux</span></span><span><span style="font-size:10.0pt;color:black">的专家，熟悉产品的采购、安装及配置定义，以及公司的软硬件架构包括负载均衡、数据库、微博等。可以</span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">follow Brian</span></span><span><span style="font-size:10.0pt;color:black">的</span></span><span><span>&nbsp;</span></span><a href="https://twitter.com/#%21/dilleybrian"><span><span><span style="font-size:10.0pt; font-family:Tahoma;color:#0B59B2">Twitter</span></span></span></a><span> </span><span><span style="font-size:10.0pt;color:black">。</span></span><span></span></p>  </div><img src ="http://www.blogjava.net/matuobasyouca/aggbug/377698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/matuobasyouca/" target="_blank">一酌散千忧</a> 2012-05-09 13:46 <a href="http://www.blogjava.net/matuobasyouca/archive/2012/05/09/377698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>