1、什么是mongodb
MongoDB是一个介于 关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立 索引 。
2、和spring集成
最近公司的项目有用到mongodb,主要用于存储日志记录,所以研究了下它和spring的集成,并且做了个简单的CRUD的封装,首先用到的包是:
spring-3.1.x以上的相关包(必须是3.1.x以上,否则集成之后运行会报错)
spring-data-mongodb-1.3.0.M1.jar
先看配置文件(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.0.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <mongo:db-factory id="mongoDbFactory" host="${mongo.host}" port="${mongo.port}" dbname="${mongo.dbname}" username="${mongo.username}" password="${database.password}"/> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/> </bean> </beans>
其中:host为mongodb服务器地址,port为端口号,dbname为数据库名,username为mongodb用户名,password为mongodb密码,好了,全部配置就在这里。
接下来就是CRUD封装类
package cn.sunsharp.alibaba.core.mongo; import java.util.List; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import cn.sunsharp.alibaba.core.Page; public interface BaseMongoDAO<T> { /** * 通过条件查询实体(集合) * * @param query */ public List<T> find(Query query) ; /** * 通过一定的条件查询一个实体 * * @param query * @return */ public T findOne(Query query) ; /** * 通过条件查询更新数据 * * @param query * @param update * @return */ public void update(Query query, Update update) ; /** * 保存一个对象到mongodb * * @param entity * @return */ public T save(T entity) ; /** * 通过ID获取记录 * * @param id * @return */ public T findById(String id) ; /** * 通过ID获取记录,并且指定了集合名(表的意思) * * @param id * @param collectionName * 集合名 * @return */ public T findById(String id, String collectionName) ; /** * 分页查询 * @param page * @param query * @return */ public Page<T> findPage(Page<T> page,Query query); /** * 求数据总和 * @param query * @return */ public long count(Query query); }
实现:
package cn.sunsharp.alibaba.core.mongo.impl; 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; import cn.sunsharp.alibaba.core.Page; import cn.sunsharp.alibaba.core.ReflectionUtils; import cn.sunsharp.alibaba.core.mongo.BaseMongoDAO; public abstract class BaseMongoDAOImpl<T> implements BaseMongoDAO<T>{ private static final int DEFAULT_SKIP = 0; private static final int DEFAULT_LIMIT = 200; /** * spring mongodb 集成操作类 */ protected MongoTemplate mongoTemplate; @Override public List<T> find(Query query) { return mongoTemplate.find(query, this.getEntityClass()); } @Override public T findOne(Query query) { return mongoTemplate.findOne(query, this.getEntityClass()); } @Override public void update(Query query, Update update) { mongoTemplate.findAndModify(query, update, this.getEntityClass()); } @Override public T save(T entity) { mongoTemplate.insert(entity); return entity; } @Override public T findById(String id) { return mongoTemplate.findById(id, this.getEntityClass()); } @Override public T findById(String id, String collectionName) { return mongoTemplate.findById(id, this.getEntityClass(), collectionName); } @Override public Page<T> findPage(Page<T> page,Query query){ long count = this.count(query); page.setTotal(count); int pageNumber = page.getPageNumber(); int pageSize = page.getPageSize(); query.skip((pageNumber - 1) * pageSize).limit(pageSize); List<T> rows = this.find(query); page.setRows(rows); return page; } @Override public long count(Query query){ return mongoTemplate.count(query, this.getEntityClass()); } /** * 获取需要操作的实体类class * * @return */ private Class<T> getEntityClass(){ return ReflectionUtils.getSuperClassGenricType(getClass()); } /** * 注入mongodbTemplate * * @param mongoTemplate */ protected abstract void setMongoTemplate(MongoTemplate mongoTemplate); }
这样,就完成了spring和mongodb的集成,其实很简单的。测试话就直接调用相关方法就可以了。。。