技术开发 频道

用MongoDB和Spring Data创建Java应用

        【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;

@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 创建接口

  下面创建关于新增,删除,查询获取的相关接口,代码如下:

package com.orangeslate.naturestore.repository;

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的接口,代码如下:

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;

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);
}
}
}
${PageNumber}

  步骤4 配置spring data for MongoDB

  还要在spring的配置文件中,进行配置spring data for MongoDB,如下:

<?xml version="1.0" encoding="UTF-8"?>
<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 创建测试用例

  最后编写一个测试用例进行测试,代码如下:

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;

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());
}
}

  最后输出结果如下:

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]]
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

0
相关文章