spring集成mongodb封装的简单的CRUD
1、什么是mongodb
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的集成,其实很简单的。测试话就直接调用相关方法就可以了。。。
spring集成mongodb封装的简单的CRUD的更多相关文章
- spring集成mongodb jar包版本问题
在开发过程中,spring集成mongodb的jar包. 如果需要使用排序功能. spring-data-mongodb-1.4.1.RELEASE.jar 的版本为1.4.1,如果使用如下代码: Q ...
- MongoDB的使用学习之(五)Spring集成MongoDB以及简单的CRUD
这篇文章不错:Spring Data - MongoDB 教程 (1.0.0.M1)http://miller-cn.iteye.com/blog/1258859 1.介绍 之前在很多地方一直见到这个 ...
- spring集成mongodb简单使用和测试方式
@EnableMongoRepositories @ComponentScan(basePackages = "cn.example") @Configuration public ...
- Spring集成Mybatis配置文件的简单理解
详情可见官方文档http://www.mybatis.org/spring/zh/index.html 一.需要配置的对象实例 1.SqlSessionFactoryBean 在 MyBatis-Sp ...
- spring集成mongodb通过aop记录业务日志
1. 编辑 pom.xml 添加 maven 依赖 <!-- mongodb --> <dependency> <groupId>org.mongodb</g ...
- Activiti工作流学习(三)Activiti工作流与spring集成
一.前言 前面Activiti工作流的学习,说明了Activiti的基本应用,在我们开发中可以根据实际的业务参考Activiti的API去更好的理解以及巩固.我们实际的开发中我们基本上都使用sprin ...
- Activiti工作流与spring集成
一.前言 前面Activiti工作流的学习,说明了Activiti的基本应用,在我们开发中可以根据实际的业务参考Activiti的API去更好的理解以及巩固.我们实际的开发中我们基本上都使用sprin ...
- 小白的springboot之路(九)、集成MongoDB
0.前言 MongoDB是一个高性能.开源的文档型数据库,是当前nosql数据库中最热门的一种,在企业中广泛应用:虽然前段时间更改了开源协议导致被很多企业舍弃,但主要是对云服务商影响较大,对我们来说其 ...
- Spring集成RabbiMQ-Spring AMQP新特性
上一篇<Spring集成RabbitMQ-使用RabbitMQ更方便>中,我们只需要添加响应jar的依赖,就可以写一个Spring集成RabbitMQ下非常简单收发消息的程序. 我们使用的 ...
随机推荐
- linux系统find命令使用
find命令简介 1.find的作用 find是个使用频率比较高的命令.常常用它在系统特定目录下,查找具有某种特征的文件. 2. find命令的格式 find [-path……]-option ...
- c/c++实现混合编程
在开发中大家经常会使用到c与c++混合编程,这样能够更好的实现功能模块.刚学习了一下c和c++的混合编程,参考了网上的相关知识,在这里留下要点,方便以后进行查阅. 1.extern关键字 extern ...
- 用Ultraiso刻录U盘装系统
一.准备工作: 1.一个U盘,也可以是手机或数码相机内存卡通过读卡器与电脑连接: 2.一个系统ISO镜像: 3.刻录软件UltraISO,用单文件绿色版就可以了. 二.开始刻录U盘: 1.启动Ultr ...
- wpf中的触发器详解
原文 http://zwkufo.blog.163.com/blog/static/25882512009724113250883/ 7.1.2 简单逻辑的表示--触发器(1) 在本章的多处介绍中都会 ...
- C++编程学习52个经典网站 强力推荐
C/C++是最主要的编程语言.这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码.这份清单提供了源代码的链接以及它们的小说明.我已尽力包括最佳的C/C++源代码的网站.这不是一个完整的清 ...
- [虚拟化/云] kvm的架构分析
预备知识 1. 客户机物理页框到宿主机虚拟地址转换 http://blog.csdn.net/zhuriyuxiao/article/details/8968781 http://www.tuicoo ...
- JAVA集合LIST MAP SET详解
1. 集合框架介绍 我们知道,计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,之前学习的数组可以用来存储并处理大量类型相同的数据,但是通过上面的课后练习,会发现 ...
- label 标签
<label> 标签为 input 元素定义标注内容 label 元素不会向用户呈现任何特殊效果.不过,它为鼠标用户改进了可用性.如果您在 label 元素内点击文本,就会触发此控件.就是 ...
- 高德地图API
这周计划: 周一 早上 (高德地图API) 中午写(IFE PART ONE) 下午(高德地图API) 下班(IFE PART ONE)
- 【CTSC1999】【解救大兵瑞恩】
44. [CTSC1999] 解救大兵瑞恩 ★★☆ 输入文件:rescue.in 输出文件:rescue.out 简单对照 时间限制:1 s 内存限制:128 MB 问题描写叙述 1944年,特种兵麦 ...