`
381895649
  • 浏览: 227773 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

spring MongoDB 集成crud操作(简单封装)

 
阅读更多

oyhk 学习笔记

这两天一直在学习mongodb,由于我的博客网站想把mysql替换成mongodb,为什么会有这样的冲动,我通过收集一些资料,关于mongodb 跟 mysql 的对比...发现性能上mongodb比上mysql是高出很多倍...无论是增,删,修,查的操作.....都比mysql效率好...但是,我也看到,mongodb是文档型数据库...做一些高级查询的时候就可能产生麻烦了..特别是做银行的数据操作时,如果出错..没得事务回滚...这些都是比较严重的问题...

分析过博客网站这整个系统,觉得还是比较适合用mongodb...对于一些表与表的关联查询,我可以用程序上去解决(这部分可能就麻烦了些,不过没关系)...所以我决定使用mongodb

 更详细请下载源代码:http://blog.mkfree.com/posts/46

下面:spring MongoDB 集成crud操作(简单封装) 开始正题了,同样也是pom.xml首先把项目的依赖都管理好,这次一样用junit用来做action的动作触发,看看项目结构图:

pom.xml

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.mkfree</groupId>
	<artifactId>Mongodb</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<dependencies>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-mongodb</artifactId>
			<version>1.0.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.6</version>
		</dependency>
	</dependencies>
	<repositories>
		<repository>
			<id>spring-release</id>
			<name>Spring Maven Release Repository</name>
			<url>http://repo.springsource.org/libs-release</url>
		</repository>
	</repositories>
</project>

 spring 配置文件:

 

mongodb.xml

 

<?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"
	xmlns:mongo="http://www.springframework.org/schema/data/mongo"
	xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
	<!-- Default bean name is 'mongo' -->
	<mongo:mongo host="127.0.0.1" port="27017" />
	<mongo:db-factory dbname="database" mongo-ref="mongo" />
	
	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
		<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
		<!-- <constructor-arg name="mongoConverter" ref="mappingConverter" /> -->
	</bean>
</beans>

 framework-context.xml

 

 

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" 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.1.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

	<!-- 扫描注解Bean -->
 	<context:component-scan base-package="com.mkfree.**.service">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
	</context:component-scan>
 	<context:component-scan base-package="com.mkfree.**.dao">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
	</context:component-scan>
	
</beans>

 这样就配置成功了..看下面的java代码

 

MongodbBaseDao.java

 

package com.mkfree.framework.common.mongodb;

import java.util.List;

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

public abstract class MongodbBaseDao{

	/**
	 * spring mongodb 集成操作类 
	 */
	protected MongoTemplate mongoTemplate;

	/**
	 * 通过条件查询实体(集合)
	 * 
	 * @param query
	 */
	public Listfind(Query query) {
		return mongoTemplate.find(query, this.getEntityClass());
	}

	/**
	 * 通过一定的条件查询一个实体
	 * 
	 * @param query
	 * @return
	 */
	public T findOne(Query query) {
		return mongoTemplate.findOne(query, this.getEntityClass());
	}

	/**
	 * 通过条件查询更新数据
	 * 
	 * @param query
	 * @param update
	 * @return
	 */
	public void update(Query query, Update update) {
		mongoTemplate.upsert(query, update, this.getEntityClass());
	}

	/**
	 * 保存一个对象到mongodb
	 * 
	 * @param bean
	 * @return
	 */
	public T save(T bean) {
		mongoTemplate.save(bean);
		return bean;
	}

	/**
	 * 通过ID获取记录
	 * 
	 * @param id
	 * @return
	 */
	public T get(String id) {
		return mongoTemplate.findById(id, this.getEntityClass());
	}

	/**
	 * 通过ID获取记录,并且指定了集合名(表的意思)
	 * 
	 * @param id
	 * @param collectionName
	 *            集合名
	 * @return
	 */
	public T get(String id, String collectionName) {
		return mongoTemplate.findById(id, this.getEntityClass(), collectionName);
	}

	/**
	 * 获取需要操作的实体类class
	 * 
	 * @return
	 */
	protected abstract ClassgetEntityClass();

	/**
	 * 注入mongodbTemplate
	 * 
	 * @param mongoTemplate
	 */
	protected abstract void setMongoTemplate(MongoTemplate mongoTemplate);
}

 ArticleDao.java

 

 

package com.mkfree.blog.dao;

import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;
import static org.springframework.data.mongodb.core.query.Update.update;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
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.stereotype.Repository;

import com.mkfree.blog.domain.Article;
import com.mkfree.framework.common.mongodb.MongodbBaseDao;

/**
 * DAO层操作类
 * 
 * @author oyhk
 * 
 *         2013-1-21下午1:57:14
 */
@SuppressWarnings("static-access")
@Repository("ArticleDao")
public class ArticleDao extends MongodbBaseDao{

	/**
	 * 通过条件去查询
	 * 
	 * @return
	 */
	public Article findOne(Map params) {
		Query query = new Query();
		Criteria criteria = new Criteria();
		criteria.where("id").is(params.get("id"));
		query.addCriteria(criteria);
		return super.findOne(query);
	}

	/**
	 * 暂时通过ID去修改title
	 * 
	 * @param id
	 * @param params
	 */
	public void updateEntity(String id, Map params) {
		super.updateEntity(query(where("id").is(id)), update("title", params.get("title")));
	}

	@Autowired
	@Qualifier("mongoTemplate")
	@Override
	protected void setMongoTemplate(MongoTemplate mongoTemplate) {
		super.mongoTemplate = mongoTemplate;
	}

	@Override
	protected ClassgetEntityClass() {
		return Article.class;
	}

}

 Article.java

 

 

package com.mkfree.blog.domain;

/**
 * 博客实体类
 * 
 * @author hk 2012-11-1 下午10:55:38
 */
public class Posts {
	private String id;// 博客ID
	private String title;// 博客标题
	private String content;// 博客内容

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

}

 ArticleService.java

 

 

package com.mkfree.blog.service;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.mkfree.blog.dao.ArticleDao;
import com.mkfree.blog.domain.Article;

@Service("articleService")
public class ArticleService {

	@Autowired
	private ArticleDao articleDao;

	public Article findByid(String id) {
		return (Article) articleDao.get(id);
	}

	public Article findOne(Map params) {
		return this.articleDao.findOne(params);
	}

	public Article save(Article bean) {
		return (Article) articleDao.save(bean);
	}

	/**
	 * 暂时只是固定去修改,会有下一篇博客,写高级修改...
	 */
	public void update(String id, Map params) {
		this.articleDao.updateEntity(id, params);
	}
}

 ArticleController.java

 

 

package com.mkfree.blog.action;

import java.util.HashMap;
import java.util.Map;

import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mkfree.blog.domain.Article;
import com.mkfree.blog.service.ArticleService;

public class ArticleController {

	private static ApplicationContext app;
	private static ArticleService articleService;

	@Test
	public void save() {
		Article a = new Article();
		a.setTitle("mongodb开始实战");
		a.setContent("mongodb开始实战..内容");
		articleService.save(a);
		System.out.println(a);
	}

	@Test
	public void findArticle() {
		Article a = articleService.findByid("50fd0c36bc40ceec1a44308b");
		System.out.println(a);
	}

	@Test
	public void update() {
		Map params = new HashMap();
		params.put("title", "修改内容...");
		articleService.update("50fe23e6bc402ee4051f90b8", params);
	}

	@BeforeClass
	public static void initSpring() {
		app = new ClassPathXmlApplicationContext(new String[] { "classpath:spring/framework-context.xml",
				"classpath:spring/mongodb.xml" });
		articleService = (ArticleService) app.getBean("articleService");
	}
}

 源代码下载:http://blog.mkfree.com/posts/46

 本文章来自: http://blog.mkfree.com/posts/46

3
0
分享到:
评论
8 楼 381895649 2013-01-24  
clongjava 写道
既然都用了spring-data-mongodb,dao层的crud就不用再写一遍了,直接写个接口继承PagingAndSortingRepository,实现交给spring-data就可以了



谢谢指教…

为什么我会这样写呢?我说出我的原因吧…
dao层,是专门操作mongodb的…很多条件查询的可以放这里…
serveice层,是专门写业余逻辑的…如果把他们都放在一起…当有很复杂的数据,你的代码就会变到好乱…难维护…
7 楼 clongjava 2013-01-24  
既然都用了spring-data-mongodb,dao层的crud就不用再写一遍了,直接写个接口继承PagingAndSortingRepository,实现交给spring-data就可以了
6 楼 381895649 2013-01-23  
q395488499 写道
请教一个问题,实体类的属性有增减情况的时候,怎么应对啊?


对于你这个问题...相信很多人都会遇到,其实我们可以直接去尝试,对象减了属性,跟添加属性..

对象增加属性跟减少属性时,mongodb数据依然一样...没有任何变化...
1.添加属性时,你多出来的属性是取值是null
2.删除属性时,当然你也看不到这个属性的值了...

下次我分析下源代码..更清晰了...
5 楼 q395488499 2013-01-23  
请教一个问题,实体类的属性有增减情况的时候,怎么应对啊?
4 楼 381895649 2013-01-23  
rick_liao 写道
org.springframework.data.mongodb.core.MongoTemplate
要啥没有?


基本上都有...只是条件方面要自己去组合
3 楼 rick_liao 2013-01-23  
org.springframework.data.mongodb.core.MongoTemplate
要啥没有?
2 楼 381895649 2013-01-23  
这就是spring data 我写漏了,谢谢提示
1 楼 dsjt 2013-01-23  
咋不试试 spring data 。

相关推荐

Global site tag (gtag.js) - Google Analytics