【IT168 专稿】当前,NOSQL时代其实已经来临,在NOSQL的大家族中,MongoDB以其可扩展性强,性能高以及开源占据了重要的地位。在MongoDB中,存储数据的方式不再是关系型数据库,而是以象JSON格式那样进行存储,所以可以称为文档型的NOSQL。本文将以一个实际的例子,介绍如何运用Spring开源框架下的Spring Data数据存取框架结合MongoDB,创建一个简单的CRUD应用(增删改查)。本文要求读者有一定的MongoDB和Spring的基础知识。
关于Spring Data For MongoDB
大家对Spring 框架应该是相当熟悉了,而Spring data 则是spring新推出的一套方便开发者对关系数据库以及NOSQL进行存取开发的基于spring的API框架。而其中的一个分支Spring Data for MongoDB则是专门为MongoDB度身订造的用于方便开发者对MongoDB进行操作的一组API。如果开发者熟悉Spring开发的话,则可以很容易地使用Spring Data for MongoDB进行开发。在Spring Data For MongoDB中,比如封装了MongoTemplate,这个模板工具类有点象JDBCTemplate工具类,可以很方便地进行MongoDB的常用操作。它其中包括能在文档对象和POJO中做对应的关联映射,还有异常的封装都跟spring是一个体系的,而且对对象的查询更新等,都可以依旧使用开发者熟悉的比如Query,Criteria等进行数据库的查询等操作,此外,还可以使用JPA对MongoDB进行操作。开发者可以在如下的地址下载Spring for MongoDB:http://www.springsource.org/download/community
安装MongoDB
下面我们快速安装MongoDB,如果用户已经熟悉如何安装MongoDB,则可以跳过本小节,直接进入下一小节。
c:\mongodb\bin\mongod.exe –dbpath c:\mongodb\data\db
1) 下载最新版本的MongoDB,解压缩到某个目录,比如c:\mongodb
2) mongodb需要一个目录去存放数据,mongodb默认的数据存放目录为c:\data\db,但我们可以随意指定目录去存放数据,这里我们指定c:\mongodb\data\db去存放数据。
3) 接下来是启动的工作,到命令行方式下输入如下指令:
c:\mongodb\bin\mongod.exe –dbpath c:\mongodb\data\db
要注意的是,如果路径中含有空格,则需要使用双引号包括起来,如:
c:\mongodb\bin\mongod.exe –dbpath“c:\mongodb\data\db store place”
如果要以服务的形式在windows中启动,请参考下面地址中的介绍:
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/
使用Spring Data For Mongodb创建应用
接下来,我们开始创建一个简单的CRUD功能的JAVA应用,首先要在工程的lib目录下,添加上Spring Data For Mongodb中相关的lib包。我们将工程命名为NatureStore,
步骤1 创建POJO
代码如下:
package com.orangeslate.naturestore.domain;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Documentpublicclass Tree {
@IdprivateStringid;privateStringname;privateStringcategory;privateintage;publicTree(Stringid,Stringname,intage) {
this.id=id;
this.name=name;
this.age=age;
}publicStringgetId() {
return id;
}publicvoid setId(Stringid) {
this.id=id;
}publicStringgetName() {
return name;
}publicvoid setName(Stringname) {
this.name=name;
}publicStringgetCategory() {
return category;
}publicvoid setCategory(Stringcategory) {
this.category=category;
}publicintgetAge() {
return age;
}publicvoid setAge(intage) {
this.age=age;
}
@OverridepublicStringtoString() {
return"Person [id="+id+", name="+name+", age="+age+", category="+category+"]";
}
}
这里创建了一个Tree的POJO,并且充分使用了Spring 的注解功能,可以看到,
@Document注解,表示这个POJO最终要持久化为MongoDB中的document,@id
指出了需要持久化的@id。${PageNumber}
步骤2 创建接口
下面创建关于新增,删除,查询获取的相关接口,代码如下:
package com.orangeslate.naturestore.repository;
import Java.util.List;
import com.mongodb.WriteResult;publicinterface Repository{//获得所有对象publicListgetAllObjects();//保存对象publicvoid saveObject(Tobject);//根据id获得对象publicTgetObject(Stringid);//更新publicWriteResult updateObject(Stringid,Stringname);//删除对象publicvoid deleteObject(Stringid);//创建collectionpublicvoid createCollection();//删除collectionpublicvoid dropCollection();
}
步骤3 创建接口的实现类
下面就是充分利用MongoDB Template模板工具类,来实现对collection的初始化,并且实现了CRUD的接口,代码如下:
package com.orangeslate.naturestore.repository;
import Java.util.List;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import com.mongodb.WriteResult;
import com.orangeslate.naturestore.domain.Tree;publicclass NatureRepositoryImpl implements Repository{
MongoTemplate mongoTemplate;publicvoid setMongoTemplate(MongoTemplate mongoTemplate) {
this.mongoTemplate=mongoTemplate;
}/***获得所有的tree*/publicListgetAllObjects() {
return mongoTemplate.findAll(Tree.class);
}/***保存一个tree对象*/publicvoid saveObject(Tree tree) {
mongoTemplate.insert(tree);
}/***通过id进行查找*/publicTreegetObject(Stringid) {
return mongoTemplate.findOne(newQuery(Criteria.where("id").is(id)),
Tree.class);
}/***根据id和name进行查找*/publicWriteResult updateObject(Stringid,Stringname) {
return mongoTemplate.updateFirst(newQuery(Criteria.where("id").is(id)),
Update.update("name", name), Tree.class);
}/***根据id删除tree*/publicvoid deleteObject(Stringid) {
mongoTemplate
.remove(newQuery(Criteria.where("id").is(id)), Tree.class);
}/***如果collection不存在则建立*/publicvoid createCollection() {if(!mongoTemplate.collectionExists(Tree.class)) {
mongoTemplate.createCollection(Tree.class);
}
}/***如果collection存在则删除之*/publicvoid dropCollection() {if(mongoTemplate.collectionExists(Tree.class)) {
mongoTemplate.dropCollection(Tree.class);
}
}
}${PageNumber}
步骤4 配置spring data for MongoDB
还要在spring的配置文件中,进行配置spring data for MongoDB,如下:
在上面的配置文件中,通过注解,配置了MongoDB的IP和端口,以及MongoDB template的实例。
步骤5 创建测试用例
最后编写一个测试用例进行测试,代码如下:
package com.orangeslate.naturestore.test;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.orangeslate.naturestore.domain.Tree;
import com.orangeslate.naturestore.repository.NatureRepositoryImpl;
import com.orangeslate.naturestore.repository.Repository;publicclass MongoTest {publicstatic void main(String[] args) {
ConfigurableApplicationContext context=newClassPathXmlApplicationContext("classpath:/spring/applicationContext.xml");
Repository repository=context.getBean(NatureRepositoryImpl.class);//插入之前先删除collection
repository.dropCollection();//创建collection
repository.createCollection();
repository.saveObject(newTree("1","Apple Tree",10));
System.out.println("1."+repository.getAllObjects());
repository.saveObject(newTree("2","Orange Tree",3));
System.out.println("2."+repository.getAllObjects());
System.out.println("Tree with id 1"+repository.getObject("1"));
repository.updateObject("1","Peach Tree");
System.out.println("3."+repository.getAllObjects());
repository.deleteObject("2");
System.out.println("4."+repository.getAllObjects());
}
}
最后输出结果如下:
1. [Person [id=1, name=Apple Tree, age=10, category=null]]2. [Person [id=1, name=Apple Tree, age=10, category=null], Person [id=2, name=Orange Tree, age=3, category=null]]
Treewithid 1Person [id=1, name=Apple Tree, age=10, category=null]3. [Person [id=1, name=Peach Tree, age=10, category=null], Person [id=2, name=Orange Tree, age=3, category=null]]4. [Person [id=1, name=Peach Tree, age=10, category=null]]
分别演示了插入,删除和查找记录。
本文完整代码可以在如下地址下载:
https://github.com/lijinjoseji/NatureStore/blob/master/NatureStore.zip