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.pswp.cn/news/373364.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373364.shtml
英文地址,請注明出處:http://en.pswp.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和適當…