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