javascript
MongoDB与Spring Data项目
在開始之前,請(qǐng)下載并運(yùn)行適用于您的操作系統(tǒng)的MongoDB 。 這非常簡(jiǎn)單,所以我不會(huì)花時(shí)間在上面,讓我們從我們項(xiàng)目的簡(jiǎn)單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這里有兩個(gè)關(guān)鍵的依賴關(guān)系:
– MongoDB Java驅(qū)動(dòng)程序
– MongoDB的 Spring數(shù)據(jù)
在Spring應(yīng)用程序上下文中幾乎沒有定義MongoDB的方法。 讓我顯示一個(gè)較為冗長(zhǎng)但更靈活的示例:
<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"/>這里每個(gè)bean的作用:
- mongo定義到MongoDB數(shù)據(jù)庫的連接(我們依賴于默認(rèn)設(shè)置,端口27027)
- 轉(zhuǎn)換器用于將Java類與MongoDB的 DBObject之間進(jìn)行轉(zhuǎn)換(== JSON)
- mongoTemplate公開了我們可以通過MongoDB執(zhí)行的操作
因此,我們準(zhǔn)備出發(fā)了!
以下是一些開始的代碼段:
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 }基本知識(shí)就是這樣。 下一篇文章將介紹高級(jí)功能:使用批量插入,更新或插入操作以及執(zhí)行MongoDB命令。 :)
在討論了MongoDB和Spring Data項(xiàng)目之后,我想展示一些高級(jí)功能(可以在下一個(gè)Spring Data里程碑或作為核心功能的一部分發(fā)布的功能)。
首先,讓我們使用一種方法對(duì)MongoService進(jìn)行擴(kuò)展,該方法對(duì)集合中與特定查詢匹配的文檔進(jìn)行計(jì)數(shù)。
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" );} }此特定功能的方法是調(diào)用本地MongoDB命令計(jì)數(shù) ,并將查詢作為參數(shù)傳遞。 返回的結(jié)構(gòu)包含n個(gè)屬性中的文檔數(shù)。
或者,以更友好的代碼方式:
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() ) );}}); }下一個(gè)有用的功能是批量插入。 請(qǐng)注意,在當(dāng)前版本的MongoDB 1.8.1中, 當(dāng)插入文檔集合中存在重復(fù)項(xiàng)時(shí),批量插入在第一個(gè)重復(fù)項(xiàng)上停止并返回,因此不會(huì)插入所有其他文檔 。 請(qǐng)注意這種行為。 在轉(zhuǎn)到代碼片段之前,讓我介紹簡(jiǎn)單的類SimpleDocument ,我們將堅(jiān)持該類到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;} }以下方法將所有文檔作為單個(gè)批量更新插入:
public void insert( final Collection< SimpleDocument > documents ) { template.insert( documents, SimpleDocument.class ); }另一個(gè)非常酷而有用的功能是MongoDB的 upserts (有關(guān)更多信息,請(qǐng)?jiān)L問http://www.mongodb.org/display/DOCS/Updating):如果存在符合特定條件的文檔,則將對(duì)其進(jìn)行更新,否則–新文檔被插入收藏。 以下是通過以下用例演示的代碼:如果存在具有此類名稱的 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;}}); }請(qǐng)注意轉(zhuǎn)換器 bean的用法,它有助于將Java類轉(zhuǎn)換為MongoDB的 DBObject。
我要顯示的最后一個(gè)是findAndModify操作,它作為一個(gè)原子序列執(zhí)行幾項(xiàng)操作:
–查找文檔匹配條件
–執(zhí)行更新
–返回更新的文檔(或舊文檔,取決于您的需求)
現(xiàn)在,這些都是我遇到的有趣的用例。 老實(shí)說,我對(duì)MongoDB感到非常興奮,并強(qiáng)烈建議它適合您的應(yīng)用程序。
參考: 與Spring Data項(xiàng)目一起開發(fā)MongoDB:基本概念和 ? 與Spring Data項(xiàng)目一起利用MongoDB:來自我們的JCG合作伙伴 Andrey Redko在Andriy Redko {devmind}博客上的高級(jí)概念 。
翻譯自: https://www.javacodegeeks.com/2012/01/mongodb-with-spring-data-project.html
總結(jié)
以上是生活随笔為你收集整理的MongoDB与Spring Data项目的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建行补卡后卡号一样吗?
- 下一篇: 招商银行日日欣赎回多久到账?