使用MongoDB和Spring Data创建一个简单的Java 的CRUD应用

王振威 发布于 2012/07/21 19:33
阅读 8K+
收藏 58
    MongoDB 是一个可扩展的、高性能的、开源的NoSQL数据库,跟传统的数据库不一样,MongoDB并不是将数据存储在表中,他将数据结构化为一个类似于JSON的文档中。这篇文章就是展示如何使用Java基于MongoDB和Spring Data创建一个CRUD应用。

 

Spring Data for MongoDB

Spring Data for MongoDB提供了一个类似于基于Sping编程模型的NoSQL数据存储。Spring Data for MongoDB提供了很多特性,它使很多MongoDB的Java开发者解放了很多。MongoTemplate helper类支持通用的Mongo操作。它整合了文档和POJO之间的对象映射。通常,他会转换数据库访问异常到Spring中的异常结构。使用起来非常的方便。
你可以点击这里下载。

五步安装MongoDB

最清楚的安装步骤当然是MongoDB官方的安装说明了。安装说明。

  1. 从这里下载最新的MongoDB。
  2. 解压到指定目录(这也算一步...)
  3. MongoDB需要一个存储文件的地方,Windows下默认的路径是C:\data\db。但是我们可以指定。例如我指定下面的路径
    C:\mongodb\data\db
  4. 到C:\mongodb\bin 文件夹下执行如下命令。
    C:\mongodb\bin\mongod.exe –dbpath C:\mongodb\data\db

    如果你的路径包含空格,请使用双引号引起来。

  5. 到C:\mongodb\bin文件夹下,执行mongo.exe。默认的,mongo脚本将会监听localhost的27017端口。如果想将MongoDB作为windows的服务运行,点击这里。

到这里MongoDB的安装就完成了,接下来使用java搞CRUD。

五步使用Spring Data创建一个应用。

  1. 使用@Document注解指明一个领域对象将被持久化到MongoDB中。@Id注解identifies。
    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 + "]";
    	}
    }
  2. 创建一个简单的接口。创建一个简单的接口,这个接口带有CRUD方法。这里我还带有createCollection方法和dropCollection方法。
    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);
    
    	public T getObject(String id);
    
    	public WriteResult updateObject(String id, String name);
    
    	public void deleteObject(String id);
    
    	public void createCollection();
    
    	public void dropCollection();
    }
  3. 创建一个指定的领域对象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;
    	}
    
    	/**
    	 * Get all trees.
    	 */
    	public List<Tree> getAllObjects() {
    		return mongoTemplate.findAll(Tree.class);
    	}
    
    	/**
    	 * Saves a {@link  Tree}.
    	 */
    	public void saveObject(Tree tree) {
    		mongoTemplate.insert(tree);
    	}
    
    	/**
    	 * Gets a {@link  Tree} for a particular id.
    	 */
    	public Tree getObject(String id) {
    		return mongoTemplate.findOne(new Query(Criteria.where("id").is(id)),
    				Tree.class);
    	}
    
    	/**
    	 * Updates a {@link  Tree} name for a particular id.
    	 */
    	public WriteResult updateObject(String id, String name) {
    		return mongoTemplate.updateFirst(
    				new Query(Criteria.where("id").is(id)),
    				Update.update("name", name), Tree.class);
    	}
    
    	/**
    	 * Delete a {@link  Tree} for a particular id.
    	 */
    	public void deleteObject(String id) {
    		mongoTemplate
    				.remove(new Query(Criteria.where("id").is(id)), Tree.class);
    	}
    
    	/**
    	 * Create a {@link  Tree} collection if the collection does not already
    	 * exists
    	 */
    	public void createCollection() {
    		if (!mongoTemplate.collectionExists(Tree.class)) {
    			mongoTemplate.createCollection(Tree.class);
    		}
    	}
    
    	/**
    	 * Drops the {@link  Tree} collection if the collection does already exists
    	 */
    	public void dropCollection() {
    		if (mongoTemplate.collectionExists(Tree.class)) {
    			mongoTemplate.dropCollection(Tree.class);
    		}
    	}
    }
  4. 创建Spring context。将所有spring beans和mongodb对象都声明在Spring context文件中,这里创建的是applicationContext.xml文件。注意到我们并没有创建一个叫做"nature"的数据库。在第一次存储数据的时候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>
    
    	<!-- Factory bean that creates the Mongo instance -->
    	<bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
    		<property name="host" value="localhost" />
    		<property name="port" value="27017" />
    	</bean>
    
    	<!-- Activate annotation configured components -->
    	<context:annotation-config />
    
    	<!-- Scan components for annotations within the configured package -->
    	<context:component-scan base-package="com.orangeslate.naturestore">
    		<context:exclude-filter type="annotation"
    			expression="org.springframework.context.annotation.Configuration" />
    	</context:component-scan>
    
    </beans>
  5. 创建一个测试类。这里我已经创建了一个测试类,并通过ClassPathXmlApplicationContext来初始化他。
    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);
    
    		// cleanup collection before insertion
    		repository.dropCollection();
    
    		// create 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());
    	}
    }

最后,让我们以Java应用程序的方式运行这个示例,我们可以看到如下的输出。第一个方法存储了一个"Apple Tree"。第二个方法存储了一个"Orange Tree"。第三个方法通过id获取一个对象。第四个使用Peach Tree更新对象。最后一个方法删除了第二个对象。

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

注:可以在GitHub上下载到源码

OSChina.NET原创翻译/原文链接

加载中
0
hantsy
hantsy
Repository都没用 Spring Data的接口,这代码和Spring Data有什么关系。
wellyao
wellyao
看Dao实现类的import
0
吴红军
吴红军

引用来自“hantsy”的答案

Repository都没用 Spring Data的接口,这代码和Spring Data有什么关系。
你问的到底是什么?真没懂, Repository和Spring data又是什么关系呢?
wellyao
wellyao
你没看标题
0
s
s3051024
spring is everywhere in the modern enterprise application
0
kakad
kakad
现在公司就用这个 很悲剧 很多问题都在mongo的bug列表中 比较想念postgresql
0
10书生
10书生
学习 学习 多些分享
0
青见
青见

听说 BUG 很多 用起来会疯掉的

0
苦逼程序员
苦逼程序员
求教!!!!怎么将Spring data的方法执行时的mong命令输出到控制台?
0
tbaby
tbaby

MongoDB Plugin可能java上最好用而且实时跟进官方版本的ORM,让您更加舒适地使用MongoDB。

  • 与MongoDB版本基本同步(基于最新3.4.0)
  • 使用方式更像是自然语言,用起来更舒适
  • 几乎没有任何学习成本
  • 支持MongoDB的授权机制(可以使用用户名和密码登录)、支持连接MongoDB副本集、读写分离、安全写入、SSL连接、地理位置等特性
  • 内置JFinal和Resty插件。(基于最新版的JFinal和Resty)

强烈推荐https://www.oschina.net/p/mongodb-plugin 

操作mongodb会异常方便和舒服

返回顶部
顶部