java mongodb开源框架_用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;

@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

mongodb-orm简介Mongodb ORM是基于java的ORM框架,简化了SDK的使用,使代码变得更清晰、简单。 与Ibatis类似,将查询、执行语句封装在xml中,与代码隔离。简称MQL。 项目中使用加入mongodb orm的支持包1. 添加jar包或maven支持<dependency>     <groupId>com.mongodborm</groupId>     <artifactId>mongodb-orm</artifactId>     <version>0.0.1-RELEASE</version> </dependency>2. 初始化mongodb templet        spring中初始化<bean id="mongoTemplet" class="com.mongodb.client.MongoClientTemplet">     <property name="factory">         <bean class="com.mongodb.client.MongoORMFactoryBean">             <property name="dataSource">                 <bean class="com.mongodb.client.MongoDataSource">                     <property name="nodeList" value="127.0.0.1:27017" />                     <property name="dbName" value="your db name" />                     <property name="userName" value="user name" />                     <property name="passWord" value="password" /> <!-- 可使用默认值 --> <property name="connectionsPerHost" value="" />                     <property name="threadsAllowedToBlock" value="" />                     <property name="connectionTimeOut" value="" />                     <property name="maxRetryTime" value="" />                     <property name="socketTimeOut" value="" />                 </bean>             </property>             <property name="configLocations">                 <list>                     <value>classpath:mql/mongo-mql.xml</value>                 </list>             </property>         </bean>     </property> </bean>        代码初始化    try {       Resource resource =  new ClassPathResource("mongo-mql.xml");           MongoORMFactoryBean factory = new MongoORMFactoryBean();       factory.setConfigLocations(new Resource[]{resource});       factory.init();          MongoClientTemplet templet = new MongoClientTemplet();       templet.setFactory(factory);       templet.init();     } catch(Exception e) {       e.printStackTrace();     }编写MQLMapping<mapping id="model" class="test.mongodborm.Model">         <property column="_id" name="id" />         <property column="name" name="name" />         <property column="time" name="time" value="0" />         <property column="status" name="status" /> </mapping> <mapping id="extendModel" class="test.mongodborm.Model" extends="model">     <property column="newProperty" name="newProperty" /> </mapping>  select<select id="queryModelList" collection="test_sample">     <query class="java.lang.String">         <property column="name" name="${value}" />     </query>     <field mapping="model" />     <order>         <property column="time" value="desc" />     </order> </select> update/findAndModify<update id="updateModel" collection="test_sample">     <query class="test.mongodborm.Model$Child">         <property column="name" name="name" ignoreNull="true" />         <property column="time" operate="gte" value="0" type="number" />         <property column="status" operate="in">             <list type="number">0,1</list>         </property>     </query>     <action class="java.util.Map">         <property column="name" name="name" operate="set" />         <property column="status" operate="set" />     </action> </update>有嵌套的查询<select id="queryModelList3" collection="test_sample">     <query class="java.lang.String">         <property column="_id" value="${value}" />         <property column="time" value="0" type="number" />     </query>     <field class="java.util.Map">         <property column="name" name="name" />         <property column="parent" name="parent">             <value class="test.mongodborm.Model$Parent">                 <property column="name" name="name" />                 <property column="child" name="child">                     <value class="test.mongodborm.Model$Child">                         <property column="name" name="name" />                         <property column="time" name="time" value="0" />                     </value>                 </property>                 <property column="data" name="data">                     <value class="java.util.Map">                         <property column="title" name="title" />                         <property column="content" name="content" />                     </value>                 </property>             </value>         </property>         <property column="data" name="data">             <value class="java.util.Map">                 <property column="title" name="title" />                 <property column="content" name="content" />             </value>         </property>     </field>     <order class="java.util.Map">         <property column="time" name="time" value="desc" />     </order> </select>Templet用法Model model = mongoTemplet.findOne("queryModelList", "yuxiangping"); List<Model> list = mongoTemplet.findOne("queryModelList", ""); Model model = new Model(); model.setTime(1L); Map<String, String> action = new HashMap<String, String>(); action.put("name", "yuxiangping-update"); int update = mongoT emplet.update("updateModel", model, action);        更多的使用方法参见 sample.xml 标签:Mongodb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值