【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,则可以跳过本小节,直接进入下一小节。
1) 下载最新版本的MongoDB,解压缩到某个目录,比如c:\mongodb
2) mongodb需要一个目录去存放数据,mongodb默认的数据存放目录为c:\data\db,但我们可以随意指定目录去存放数据,这里我们指定c:\mongodb\data\db去存放数据。
3) 接下来是启动的工作,到命令行方式下输入如下指令:
要注意的是,如果路径中含有空格,则需要使用双引号包括起来,如:
如果要以服务的形式在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
代码如下:
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document
public class Tree {
@Id
private String id;
private String name;
private String category;
private int age;
public Tree(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ ", category=" + category + "]";
}
}
这里创建了一个Tree的POJO,并且充分使用了Spring 的注解功能,可以看到,
@Document注解,表示这个POJO最终要持久化为MongoDB中的document,@id
指出了需要持久化的@id。
${PageNumber}步骤2 创建接口
下面创建关于新增,删除,查询获取的相关接口,代码如下:
import Java.util.List;
import com.mongodb.WriteResult;
public interface Repository<T> {
//获得所有对象
public List<T> getAllObjects();
//保存对象
public void saveObject(T object);
//根据id获得对象
public T getObject(String id);
//更新
public WriteResult updateObject(String id, String name);
//删除对象
public void deleteObject(String id);
//创建collection
public void createCollection();
//删除collection
public void dropCollection();
}
步骤3 创建接口的实现类
下面就是充分利用MongoDB Template模板工具类,来实现对collection的初始化,并且实现了CRUD的接口,代码如下:
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;
public class NatureRepositoryImpl implements Repository<Tree> {
MongoTemplate mongoTemplate;
public void setMongoTemplate(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
/**
* 获得所有的tree
*/
public List<Tree> getAllObjects() {
return mongoTemplate.findAll(Tree.class);
}
/**
*保存一个tree对象
*/
public void saveObject(Tree tree) {
mongoTemplate.insert(tree);
}
/**
* 通过id进行查找
*/
public Tree getObject(String id) {
return mongoTemplate.findOne(new Query(Criteria.where("id").is(id)),
Tree.class);
}
/**
*根据id和name进行查找
*/
public WriteResult updateObject(String id, String name) {
return mongoTemplate.updateFirst(
new Query(Criteria.where("id").is(id)),
Update.update("name", name), Tree.class);
}
/**
* 根据id删除tree
*/
public void deleteObject(String id) {
mongoTemplate
.remove(new Query(Criteria.where("id").is(id)), Tree.class);
}
/**
* 如果collection不存在则建立
*/
public void createCollection() {
if (!mongoTemplate.collectionExists(Tree.class)) {
mongoTemplate.createCollection(Tree.class);
}
}
/**
* 如果collection存在则删除之
*/
public void dropCollection() {
if (mongoTemplate.collectionExists(Tree.class)) {
mongoTemplate.dropCollection(Tree.class);
}
}
}
步骤4 配置spring data for MongoDB
还要在spring的配置文件中,进行配置spring data for MongoDB,如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="natureRepository"
class="com.orangeslate.naturestore.repository.NatureRepositoryImpl">
<property name="mongoTemplate" ref="mongoTemplate" />
</bean>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongo" ref="mongo" />
<constructor-arg name="databaseName" value="nature" />
</bean>
<!—配置mongo的ip,端口-->
<bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
<property name="host" value="localhost" />
<property name="port" value="27017" />
</bean>
<context:annotation-config />
<context:component-scan base-package="com.orangeslate.naturestore">
<context:exclude-filter type="annotation"
expression="org.springframework.context.annotation.Configuration" />
</context:component-scan>
</beans>
在上面的配置文件中,通过注解,配置了MongoDB的IP和端口,以及MongoDB template的实例。
步骤5 创建测试用例
最后编写一个测试用例进行测试,代码如下:
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;
public class MongoTest {
public static void main(String[] args) {
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:/spring/applicationContext.xml");
Repository repository = context.getBean(NatureRepositoryImpl.class);
// 插入之前先删除collection
repository.dropCollection();
// 创建collection
repository.createCollection();
repository.saveObject(new Tree("1", "Apple Tree", 10));
System.out.println("1. " + repository.getAllObjects());
repository.saveObject(new Tree("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());
}
}
最后输出结果如下:
2. [Person [id=1, name=Apple Tree, age=10, category=null], Person [id=2, name=Orange Tree, age=3, category=null]]
Tree with id 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