MongoDB与Spring Data项目

如今,我们所有人都在观察NoSql解决方案的爆炸式增长。 我已经习惯了RDBMS,但这些并不是您可能遇到的所有挑战的解决方案。 根据最近的经验,我有机会使用MongoDB –文档数据库。 在本文中,我打算介绍将MongoDB与Spring Data项目一起使用的一些基础知识(以及下一篇文章中的一些高级功能)。 在开始之前,请先声明以下内容:目前Spring Data仍处于里程碑阶段,因此某些类/接口可能会更改。

在开始之前,请下载并运行适用于您的操作系统的MongoDB 。 这非常简单,所以我不会花时间在上面,让我们从我们项目的简单POM文件开始:

4.0.0mongodbcom.example.spring0.0.1-SNAPSHOTjarUTF-83.0.5.RELEASEorg.springframework.dataspring-data-mongodb1.0.0.M3log4jlog4j1.2.16org.mongodbmongo-java-driver2.5.3org.springframeworkspring-core${spring.version}org.springframeworkspring-context${spring.version}springsource-milestoneSpring Framework Milestone Repositoryhttp://maven.springframework.org/milestone

这里有两个关键的依赖关系:

– MongoDB Java驱动程序
– MongoDB的 Spring数据

在Spring应用程序上下文中几乎没有定义MongoDB的方法。 让我显示一个较为冗长但更灵活的示例:

<beans xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/data/mongohttp://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><constructor-arg index="0" ref="mongo" /><constructor-arg index="1" value="elements-db"/><constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /><constructor-arg name="mappingContext" ref="mappingContext" />         <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/><constructor-arg name="mongoConverter" ref="converter" />        <property name="writeResultChecking" value="EXCEPTION" /><property name="writeConcern" value="NORMAL"/>

这里每个bean的作用:

  • mongo定义到MongoDB数据库的连接(我们依赖于默认设置,端口27027)
  • 转换器用于将Java类与MongoDB的 DBObject之间进行转换(== JSON)
  • mongoTemplate公开了我们可以通过MongoDB执行的操作

因此,我们准备出发了!

以下是一些开始的代码段:

package com.example.mongodb;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.document.mongodb.CollectionCallback;
import org.springframework.data.document.mongodb.MongoOperations;
import org.springframework.data.document.mongodb.query.Index;
import org.springframework.data.document.mongodb.query.Index.Duplicates;
import org.springframework.data.document.mongodb.query.Order;
import org.springframework.stereotype.Service;import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.MongoException;@Service
public class MongoService  {@Autowired private MongoOperations template;public void createCollection( final String name ) {template.createCollection( name  );}public void dropCollection( final String name ) {template.dropCollection( name  );}public void insert( final Object object, final String collection ) {template.insert( object, collection );}public void createIndex( final String name, final String collection ) {template.ensureIndex( new Index().on( name, Order.DESCENDING ).unique( Duplicates.DROP ), collection  );}// Remove / save / ... operations here
}

基本知识就是这样。 下一篇文章将介绍高级功能:使用批量插入,更新或插入操作以及执行MongoDB命令。 :)

在讨论了MongoDB和Spring Data项目之后,我想展示一些高级功能(可以在下一个Spring Data里程碑或作为核心功能的一部分发布的功能)。

首先,让我们使用一种方法对MongoService进行扩展,该方法对集合中与特定查询匹配的文档进行计数。

package com.example.mongodb;
import java.util.Arrays;
import java.util.Collection;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.document.mongodb.CollectionCallback;
import org.springframework.data.document.mongodb.MongoOperations;
import org.springframework.data.document.mongodb.convert.MongoConverter;
import org.springframework.data.document.mongodb.query.Criteria;
import org.springframework.data.document.mongodb.query.Index;
import org.springframework.data.document.mongodb.query.Index.Duplicates;
import org.springframework.data.document.mongodb.query.Order;
import org.springframework.data.document.mongodb.query.Query;import org.springframework.stereotype.Service;
import org.springframework.util.Assert;import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.MongoException;@Service
public class MongoService {public long countDocuments( final String collection, final Query query ) {  return template.executeCommand( "{ " +"\"count\" : \"" + collection + "\"," +"\"query\" : " + query.getQueryObject().toString() + " }"  ).getLong( "n" );}
}

此特定功能的方法是调用本地MongoDB命令计数 ,并将查询作为参数传递。 返回的结构包含n个属性中的文档数。

或者,以更友好的代码方式:

import org.springframework.dao.DataAccessException;
import org.springframework.data.document.mongodb.CollectionCallback;import com.mongodb.DBCollection;
import com.mongodb.MongoException;public long countDocuments( final String collection, final Query query ) {  return template.execute( collection,new CollectionCallback< Long >() {@Overridepublic Long doInCollection( DBCollection collection ) throws MongoException, DataAccessException {return collection.count( q.getQueryObject() ) );}});
}

下一个有用的功能是批量插入。 请注意,在当前版本的MongoDB 1.8.1中, 当插入文档集合中存在重复项时,批量插入在第一个重复项上停止并返回,因此不会插入所有其他文档 。 请注意这种行为。 在转到代码片段之前,让我介绍简单的类SimpleDocument ,我们将坚持该类到MongoDB :

package com.example.mongodb;import org.springframework.data.document.mongodb.mapping.Document;@Document( collection = "documents" )
public class SimpleDocument {private String id;private String name;private String content;public SimpleDocument() { }public SimpleDocument( final String id, final String name ) {this.id = id;this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}

以下方法将所有文档作为单个批量更新插入:

public void insert( final Collection< SimpleDocument > documents ) {  template.insert( documents, SimpleDocument.class );     
}

另一个非常酷而有用的功能是MongoDB的 upserts (有关更多信息,请访问http://www.mongodb.org/display/DOCS/Updating):如果存在符合特定条件的文档,则将对其进行更新,否则–新文档被插入收藏。 以下是通过以下用例演示的代码:如果存在具有此类名称的 SimpleDocument ,它将被更新,否则将新文档添加到集合中:

@Autowired private MongoConverter converter;public void insertOrUpdate( final SimpleDocument document ) {final BasicDBObject dbDoc = new BasicDBObject();converter.write( document, dbDoc );template.execute( SimpleDocument.class, new CollectionCallback< Object >() {public Object doInCollection( DBCollection collection ) throws MongoException, DataAccessException {collection.update( new Query().addCriteria( new Criteria( "name" ).is( document.getName() ) ).getQueryObject(), dbDoc,  true, false );return null;}});
}

请注意转换器 bean的用法,它有助于将Java类转换为MongoDB的 DBObject。

我要显示的最后一个是findAndModify操作,它作为一个原子序列执行几项操作:

–查找文档匹配条件
–执行更新
–返回更新的文档(或旧文档,取决于您的需求)

public void findAndModify( final Query query, final Update update ) {return template.execute( SimpleDocument.class,new CollectionCallback< SimpleDocument >() {@Overridepublic SimpleDocument doInCollection( DBCollection collection ) throws MongoException, DataAccessException {return converter.read( SimpleDocument.class,       collection.findAndModify( query.getQueryObject(), null,null,false,update.getUpdateObject(),true,false) );}}   );
}

现在,这些都是我遇到的有趣的用例。 老实说,我对MongoDB感到非常兴奋,并强烈建议它适合您的应用程序。

参考: 与Spring Data项目一起开发MongoDB:基本概念和   与Spring Data项目一起利用MongoDB:来自我们的JCG合作伙伴 Andrey Redko在Andriy Redko {devmind}博客上的高级概念 。


翻译自: https://www.javacodegeeks.com/2012/01/mongodb-with-spring-data-project.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java转换为字符串_java – 如何从int转换为字符串?

正常方式是Integer.toString(i)或String.valueOf(i)。串联将工作&#xff0c;但它是非常规的&#xff0c;可能是一个难闻的气味&#xff0c;因为它暗示作者不知道上述两种方法(他们不知道什么&#xff1f;)。Java在使用字符串(见the documentation)时对操作符提供了特殊的支持&…

简学LINGO(三)——实例篇

1. 装配线平衡模型 一个装配线含有一系列的工作站。在终于产品的加工过程中每一个工作站运行一种或者是几种特定的任务。装配线周期是指全部工作站完毕分配给他们各自任务所花费时间的最大值。平衡装配线的目标是为每一个工作站分配加工任务。尽可能使每一个工作站运行同样数量…

Hibernate缓存级别教程

开始使用Hibernate的人们常见的问题之一就是性能&#xff0c;如果您没有太多的Hibernate经验&#xff0c;您会发现应用程序变慢的速度。 如果启用sql跟踪&#xff0c;您将看到有多少查询被发送到数据库&#xff0c;而这些查询几乎不需要Hibernate知识就可以避免。 在当前文章中…

java方法执行的时间_计算Java中任意一个方法的执行时间的工具类

1 packagealgorithm.study.utils;23 importjava.lang.reflect.Method;45 /**6 * This class is getting a method execute time and provide some other functions.7 *8 *authorygh 2017年2月24日9 */10 public classMethodExecuteTimeUtils {1112 /**13 * Get a method execut…

如何在 IIS 中设置 HTTPS 服务

Windows Server2008、IIS7启用CA认证及证书制作完整过程 这篇文章介绍了如何安装证书申请工具&#xff1b; 如何在iis创建证书申请&#xff1b; 如何使用iis申请证书生成的txt文件&#xff0c;在工具中开始申请证书&#xff1b; 如何导出证书&#xff1b; 以及在网站中开始使用…

Android之卫星菜单的实现

卫星菜单是现在一个非常受欢迎的“控件”&#xff0c;很多Android程序员都趋之若鹜&#xff0c;预览如下图。传统的卫星菜单是用Animation实现的&#xff0c;需要大量的代码&#xff0c;而且算法极多&#xff0c;一不小心就要通宵Debug。本帖贴出用属性动画Animator来实现卫星菜…

Java中的WADL:温和的介绍

WADL&#xff08; Web应用程序描述语言 &#xff09;对REST而言&#xff0c;WSDL对SOAP而言。 这种语言的仅仅存在引起了很多争议&#xff08;请参阅&#xff1a; 我们需要WADL吗&#xff1f; 或者 需要 WADL还是不需要WADL &#xff09;。 我可以想到使用WADL的一些合法用例&a…

类成员函数模板特化

//类成员函数模板特化 #include <stdio.h> class A{ public:template <class T>void Print(){printf("A template\n");} };template<> void A::Print<int>(){printf("int\n"); }int main(){A a;a.Print<double>();a.Print&l…

为云量身定制您的服务

相信大家都听说过Amazon的AWS。作为业内最为成熟的云服务提供商&#xff0c;其运行规模&#xff0c;稳定性&#xff0c;安全性都已经经过了市场的考验。时至今日&#xff0c;越来越多的应用被部署在了AWS之上。这其中不乏Zynga及Netflix这样著名的服务。 然而这一切并没有停滞不…

在Vaadin和JSF之间选择

随着最新版本的Primefaces 3.0的发布&#xff0c;JSF终于达到了前所未有的成熟度和实用性&#xff0c;使其与其他流行的Rich Internet Applications&#xff08;RIA&#xff09;选项如Google Web Toolkit&#xff08;GWT&#xff09;&#xff0c;ExtJS&#xff0c;Vaadin&#…

20145202马超《信息安全系统设计基础》实验二总结

[实验二]&#xff08;http://www.cnblogs.com/nizaikanwoma/p/6131778.html&#xff09; 转载于:https://www.cnblogs.com/tuolemi/p/6131987.html

java 连接ldap_ldap java 连接demo

public class LDAPHelper {/*** LDAP可以理解为一个多级目录&#xff0c;这里&#xff0c;表示要连接到那个具体的目录*/private final String baseDn "ouPeople,dcchangyeyi,dccom";private LdapContext ctx null;private final Control[] connCtls null;private…

flask开发restful api系列(1)

在此之前&#xff0c;向大家说明的是&#xff0c;我们整个框架用的是flask sqlalchemy redis。如果没有开发过web&#xff0c;还是先去学习一下&#xff0c;这边只是介绍如果从开发web转换到开发移动端。如果flask还不是很熟悉&#xff0c;我建议先到这个网站简单学习一下&am…

Apache Commons Lang StringUtils

因此&#xff0c;认为最好谈论我喜欢的另一个Java库。 它已经存在了一段时间&#xff0c;也许不是最令人兴奋的库&#xff0c;但是它非常有用。 我可能每天都使用它。 org.apache.commons.lang.StringUtils StringUtils是Apache Commons Lang&#xff08; http://commons.apac…

JEE7:展望新时代

计划于2012年下半年发布的Java EE 7预计的JSR都已启动并正在运行。 Java EE 7发行版是日期驱动的&#xff0c;它将反映该行业迁移到云中时不断变化的需求&#xff1a;任何未准备就绪的内容将推迟到Java EE 8中使用 。 这是Java EE 7平台中不同规范的关键功能的更新和摘要。 1。…

Cocos2d-JS项目之UI界面的优化

测试环境&#xff1a; iphone4、iOS6.1.2、chrome 37.2062.60&#xff0c;Cocos2d-js 3.6 之前写了不少&#xff0c;实际项目也按这个去优化了&#xff0c;也有效果&#xff0c;但到最后才发现&#xff0c;尼玛&#xff0c;之前都搞错了&#xff0c;之所以有效果是歪打正着。。…

java数_java大数

java大数还是很好用的&#xff01;基本加入&#xff1a;import java.math.BigInteger;import jave.math.BigDecimal;分别是大数和大浮点数。首先读入可以用&#xff1a;Scanner input new Scanner(System.in);BigInteger a input.nextBigInteger();这样读还是很方便的当然还有…

【Qt之Quick模块】6. QML语法详解_2类型系统

描述 在QML文档中对象层次结构的定义中可能使用的类型可以来自各种来源。它们可能是: 由QML语言原生提供通过QML模块通过c注册由QML模块作为QML文档提供 此外&#xff0c;应用程序开发人员可以通过直接注册c类型&#xff0c;或者通过在QML文档中定义可重用的组件(然后可以导…

JS显示当前时间(包含农历时间)

时间格式&#xff1a; JavaScript代码&#xff1a; var sWeek new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");var dNow new Date();var CalendarData new Arra…

Maven原型创建技巧

我最近需要为姜黄SOA项目创建一些Maven原型。 对于不了解的人来说&#xff0c; Maven原型是一种基于一些预先罐装的项目模板生成项目的方法。 对于当前的姜黄SOA原型&#xff0c;它将创建一个多模块Maven项目&#xff0c;该项目包含Interface和Service项目以及基本的WSDL和适当…