- 浏览: 102751 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (209)
- http://docs.jpush.io/server/java_sdk/ (1)
- SpingMVC ModelAndView (1)
- Model (1)
- Control以及参数传递 (1)
- https://www.alipay.com/ (1)
- 检查指定的字符串列表是否不为空。 (1)
- 转自http://my.oschina.net/rpgmakervx/blog/505434 (1)
- 压缩js (1)
- 含包含 字母数字校验 (1)
- 判断浏览器是ie (1)
- fixbox (0)
- 转自http://www.cnblogs.com/lanzi/archive/2010/10/26/1861338.html (1)
- http://dl2.iteye.com/upload/attachment/0113/2406/afbd8d53-dcad-3afc-8d78-41c1591 (0)
- IDEA (0)
- maven搭建 (0)
- http://www.jeasyuicn.com/api/docTtml/index.htm (1)
- 给tomcat添加运行内存: (1)
- JPUSH推送 (1)
- requestScope (0)
- oracle中plsql安装client10连接数据库 (1)
- 不需要安装oracle11g (1)
- tuikuan (1)
- http://www.hjxmall.com/index.php (1)
- java (1)
- 参考 (1)
- xml签名验签模拟程序 (1)
- 技术网站收集分享 (1)
- Java NIO提供了与标准IO不同的IO工作方式 ------来源于 http://www.iteye.com/magazines/132-Java-NIO (1)
- oracle表查询语句优化 (0)
- oracle (5)
- a (1)
- TenpayHttpClient (2)
- mongodb (1)
- http://www.qcloud.com/product/cmongo.html?utm_source=pcsem1&utm_medium=bdgj46&utm_campaign=baidu (1)
- SpringMVC整合MongoDB开发 (0)
- SpringMVC整合MongoDB开发 https://www.mongodb.org (1)
- Java 语言中常见问题总结 (1)
- 数据库SQL优化大总结 (1)
- 拦截器与过滤器的区别 (1)
- Struts2中拦截器与过滤器的区别及执行顺序 (1)
- Spring声明式事务管理与配置 (0)
- oracle OPERTION (1)
- java 高并发多线程开发 (1)
- Collection 与 map 接口相关集合 (1)
- 多线程开发实践 (1)
- JVM调优总结 转自 http://www.importnew.com/18694.html (1)
- redis 五种数据类型的使用场景 转自于 http://blog.csdn.net/gaogaoshan/article/details/41039581 (1)
- HttpWatch http基础 来自于http://blog.csdn.net/gaogaoshan/article/details/21237555 (1)
- maven 远程仓库 http://blog.csdn.net/gaogaoshan/article/details/40266779 (1)
- 生成Webservice客户端的4中方法 http://blog.csdn.net/gaogaoshan/article/details/8980775 (1)
- http://fgh2011.iteye.com/blog/1564283 (1)
- sleep和wait有什么区别 http://xiaowei2002.iteye.com/blog/2174188 (1)
- JDK中常用包及其类 常见的几种RuntimeException (1)
- Java的运行原理 (1)
- mybatis缓存的使用及理解 http://my.oschina.net/dxqr/blog/123163 (1)
- 软件架构设计分析 (1)
- redis技术总结 (3)
- java面试总结知识点 (1)
- ZooKeeper技术 (1)
- Hadoop (1)
- sso单点登录 (1)
- SpringIOC (1)
- 书签ssssssssssssssssssssss (1)
- spring事务的隔离级别 http://www.cnblogs.com/yangy608/archive/2011/06/29/2093478.html (1)
- 秒杀系统架构分析与实战 http://www.importnew.com/18920.html (1)
- oracle 连接plsql配置 (1)
- maven工程集成springmvc http://blog.csdn.net/fox_lht/article/details/16952683 (1)
- java类序列化与反序列化版本唯一号serialVersionUID (1)
- spring注解用法总结 (1)
- eclipse导入maven项目找不到资源文件方法 (1)
- dubbo (0)
- socket 网络编程 服务器与客户端 编程 (1)
- Thread与Runnable实现线程利用线程插队实现求和操作 (1)
- 生产者与消费者模式 (1)
- JAXB注解 java 关于xml的注解,自动生成xml文件 - @XML*** (1)
- xml 与JAVAbean转换 (1)
- MAP (2)
- decimalToString (1)
- 反编译插件 (0)
- 反编译插件 https://sourceforge.net/projects/jadclipse/?source=typ_redirect (1)
- AWX (1)
- 官网地址Dinp (1)
- public interface ExecutorService extends Executor (1)
- MAIN (1)
- 转自于 http://blog.csdn.net/lufeng20/article/details/24314381 (1)
- JaxbUtil (1)
- HttpXmlClient (0)
- Http post 请求 (1)
- URLDecoder (1)
- spdb (0)
- 订单号生成规则 (1)
- 距离0点毫秒数 (1)
- MyBatis存储过程调用java (1)
- Banks (1)
- 学习网址 (1)
- hots配置oracle数据库配置修改 (1)
- 支付宝文档 (1)
- Jadclipse (1)
- filter (0)
- Filter过滤器 (1)
- 工具类 fixbox (1)
- java quartz (0)
- java quartz 实现定时任务,每个礼拜一到礼拜五定时执行 (1)
- Thread (4)
- getResourceAsStream (1)
- BigData (1)
- 开源架构 (17)
- 架构 (0)
- 文件操作 (2)
- tools (20)
- 测试工具 (1)
- vm (1)
- mq (1)
- blog (1)
- 开源架构搭建技术 (6)
- JAVA细节技术点总结 (1)
- 优化技术 (1)
- LINUX命令使用 (1)
- spring (2)
- 大数据 (1)
- struts2 (1)
- python (1)
- pay (1)
- linux (1)
- 压力测试 (1)
- 代码检查插件 (1)
- 游戏端开发 (1)
- 微信开发相关 (1)
- 搜索引擎 (1)
- 网络技术 (1)
- 分布式部署 (1)
- 堆栈信息 (1)
最新评论
开发环境:
操作系统:windows xp
Mongodb:2.0.6
依 赖 包:Spring3.2.2 + spring-data-mongodb-1.3.0 + Spring-data-1.5 + mongodb2.7.3
说 明:Springmvc整合Mongodb的时候建议选择稳定版的Spring-data-mongdb。Mongodb1.0.1中存在数据映射bug.所以使用1.3.0.
项目结构图:
说明:
持久层操作使用MongoTemplate类操作.实现将对象与Mongodb库中的数据交互操作.
这里需要说明的是我的实体对象中的id属性对应的是库中记录中的_id属性.
Mongodb与SpringMVC整合参见文档: http://www.linuxidc.com/Linux/2015-02/114229.htm
Mongodb的高级操作:
添加对象到数据库
/**
* 保存一个对象
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:37:28
*
* @param t
* @return
*/
public void save(T t){
log.info("[Mongo Dao ]save:" + t);
this.mongoTemplate.save(t);
}
根据Id从库中查询对象
/**
* 根据Id从Collection中查询对象
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-17 下午01:59:55
*
* @param id
* 实体对象的Id,对应Collection中记录的_id字段.
* <p>
* 需要说明的是,Mongdo自身没有主键自增机制.解决方法
* <ol>
* <li>实体入库的时候,程序中为实体赋主键值.
* <li>实体入库的时候,在mongodb中自定义函数实现主键自增机制.定义方法同js代码类似
* </ol>
* </p>
* @return
*/
public T queryById(String id) {
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(id);
query.addCriteria(criteria);
log.info("[Mongo Dao ]queryById:" + query);
return this.mongoTemplate.findOne(query, this.getEntityClass());
}
根据条件从库中查询
/**
* 根据条件查询集合
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:32:54
*
* @param query
* 查询条件
* @return
* 满足条件的集合
*/
public List<T> queryList(Query query){
log.info("[Mongo Dao ]queryList:" + query);
return this.mongoTemplate.find(query, this.getEntityClass());
}
根据条件查询单个记录
/**
* 通过条件查询单个实体
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:33:12
*
* @param query
* @return
*/
public T queryOne(Query query){
log.info("[Mongo Dao ]queryOne:" + query);
return this.mongoTemplate.findOne(query, this.getEntityClass());
}
说明:查询单个用的是mongoTemplate.findOne方法,查询多条的用的是mongoTemplate.find.
分页查询操作
/**
* 通过条件进行分页查询
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:33:30
*
* @param query
* 查询条件
* @param start
* 查询起始值
* <strong> 类似mysql查询中的 limit start, size 中的 start</strong>
* @param size
* 查询大小
* <strong> 类似mysql查询中的 limit start, size 中的 size</strong>
* @return
* 满足条件的集合
*/
public List<T> getPage(Query query, int start, int size){
query.skip(start);
query.limit(size);
log.info("[Mongo Dao ]queryPage:" + query + "(" + start +"," + size +")");
List<T> lists = this.mongoTemplate.find(query, this.getEntityClass());
return lists;
}
/**
* 根据条件查询库中符合记录的总数,为分页查询服务
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:35:44
*
* @param query
* 查询条件
* @return
* 满足条件的记录总数
*/
public Long getPageCount(Query query){
log.info("[Mongo Dao ]queryPageCount:" + query);
return this.mongoTemplate.count(query, this.getEntityClass());
}
根据Id删除操作
/**
* 根据Id删除用户
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午04:09:20
*
* @param id
*/
public void deleteById(String id) {
Criteria criteria = Criteria.where("_id").in(id);
if(null!=criteria){
Query query = new Query(criteria);
log.info("[Mongo Dao ]deleteById:" + query);
if(null!=query && this.queryOne(query)!=null){
this.delete(query);
}
}
}
删除对象操作
/**
* 删除对象
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:45:33
*
* @param t
*/
public void delete(T t){
log.info("[Mongo Dao ]delete:" + t);
this.mongoTemplate.remove(t);
}
修改操作:
说明:Mongodb的修改操作大致有3中.
mongoTemplate.updateFirst操作、mongoTemplate.updateMulti操作、this.mongoTemplate.upsert操作.
分别表示修改第一条、修改符合条件的所有、修改时如果不存在则添加.
修改满足条件的第一条记录
/**
* 更新满足条件的第一个记录
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:47:10
*
* @param query
* @param update
*/
public void updateFirst(Query query,Update update){
log.info("[Mongo Dao ]updateFirst:query(" + query + "),update(" + update + ")");
this.mongoTemplate.updateFirst(query, update, this.getEntityClass());
}
修改满足条件的多条记录
/**
* 更新满足条件的所有记录
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:48:02
*
* @param query
* @param update
*/
public void updateMulti(Query query, Update update){
log.info("[Mongo Dao ]updateMulti:query(" + query + "),update(" + update + ")");
this.mongoTemplate.updateMulti(query, update, this.getEntityClass());
}
修改,如果要修改的对象不存在则添加
/**
* 查找更新,如果没有找到符合的记录,则将更新的记录插入库中
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:48:58
*
* @param query
* @param update
*/
public void updateInser(Query query, Update update){
log.info("[Mongo Dao ]updateInser:query(" + query + "),update(" + update + ")");
this.mongoTemplate.upsert(query, update, this.getEntityClass());
}
上面的操作是Mongodb的基础操作封装,利用泛型实现的抽象类MongoGenDao.java,泛型中定义钩子方法,然后Dao类继承抽象类,实现该钩子方法,返回反射的类型.钩子方法的定义如下:
/**
* 钩子方法,由子类实现返回反射对象的类型
*
* @author <a href='mailto:dennisit@163.com'>Cn.pudp(En.dennisit)</a> Copy Right since 2013-10-13 下午03:21:48
*
* @return
*/
protected abstract Class<T> getEntityClass();
Mongodb基础操作封装大致就这么多
接下来介绍如何在数据Dao中根据需要复写我们的持久层基础操作.实例是会员管理的基础实现.
package com.pudp.dao;
import java.util.List;
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 org.springframework.stereotype.Repository;
import com.pudp.base.MongoGenDao;
import com.pudp.model.Member;
import com.pudp.util.StringUtil;
/**
* description:
*
* @author <a href='mailto:dennisit@163.com'> Cn.苏若年 (En.dennisit)</a> Copy Right since 2013-10-13
*
* com.pudp.dao.MemberDao.java
*
*/
@Repository
public class MemberDao extends MongoGenDao<Member>{
/**
* 分页查询 对应mongodb操作中的 db.member.find().skip(10).limit(10);
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午04:09:58
*
* @param member
* 查询的条件
* @param start
* 用户分页查询的起始值
* @param size
* 查询的数据数目
*
* @return
* 返回查询到的数据集合
*/
public List<Member> queryPage(Member member, Integer start, Integer size) {
Query query = new Query();
//此处可以增加分页查询条件Criteria.然后query.addCriteria(criteria);
return this.getPage(query,(start-1)*size,size);
}
/**
* 查询满足分页的记录总数
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-16 上午10:20:12
*
* @param member
* 查询的条件
* @return
* 返回满足条件的记录总数
*/
public Long queryPageCount(Member member){
Query query = new Query();
//此处可以增加分页查询条件Criteria.然后query.addCriteria(criteria);
return this.getPageCount(query);
}
/**
* 更新操作
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-17 下午02:21:26
*
* @param member
* 要更新的数据
* @throws Exception
* 更新异常
*/
public void updateFirst(Member member) throws Exception {
Update update = new Update();
if(null==member.getId()||"".equals(member.getId().trim())){
//如果主键为空,则不进行修改
throw new Exception("Update data Id is Null");
}
if(StringUtil.isNotNullValue(member.getUsername())){
update.set("username", member.getUsername());
}
if(StringUtil.isNotNullValue(member.getPassword())){
update.set("password", member.getPassword());
}
if(StringUtil.isNotNullValue(member.getSex())){
update.set("sex", member.getSex());
}
if(StringUtil.isNotNullValue(member.getEmail())){
update.set("email", member.getEmail());
}
this.updateFirst(Query.query(Criteria.where("_id").is(member.getId())),update);
}
/**
* 更新库中所有数据
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-17 下午02:22:07
*
* @param member
* 更新的数据
* @throws Exception
* 更新异常
*/
public void updateMulti(Member member) throws Exception {
Update update = new Update();
if(null==member.getId()||"".equals(member.getId().trim())){
//如果主键为空,则不进行修改
throw new Exception("Update data Id is Null");
}
if(StringUtil.isNotNullValue(member.getUsername())){
update.set("username", member.getUsername());
}
if(StringUtil.isNotNullValue(member.getPassword())){
update.set("password", member.getPassword());
}
if(StringUtil.isNotNullValue(member.getSex())){
update.set("sex", member.getSex());
}
if(StringUtil.isNotNullValue(member.getEmail())){
update.set("email", member.getEmail());
}
this.updateMulti(Query.query(Criteria.where("_id").is(member.getId())),update);
}
/**
* 实现钩子方法,返回反射的类型
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-17
*
* @return
* 反射类型
*/
@Override
protected Class<Member> getEntityClass() {
return Member.class;
}
}
业务层调用Dao进行业务数据的交互.这里列出实例中的Service层中对持久层分页操作的实现
/**
* 分页查询
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-17
*
* @param member
* 查询的条件
* @param start
* 对应<code>Page</code>工具类的属性当前页:pageNum
* @param size
* 对应<code>Page</code>工具类的属性每页显示多少条记录:pageSize
* @return
*/
public Page<Member> queryPage(Member member, int start, int size) {
Page<Member> page = new Page<Member>();
try {
List<Member> list = this.memberDao.queryPage(member, start, size);
Long recordTotal = this.memberDao.queryPageCount(member);
page= new Page<Member>(list, recordTotal, (long)start, size);
log.info(page);
} catch (Exception e) {
e.printStackTrace();
}
return page;
}
至此,SpringMVC整合mongodb的高级操作实例完毕,实例中使用jquery.Pager插件分页. 这个属于分页插件的应用,就不介绍了.
运行效果图:
MongoDB 的详细介绍:请点这里
MongoDB 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-02/114229.htm
https://www.mongodb.org/downloads#production
操作系统:windows xp
Mongodb:2.0.6
依 赖 包:Spring3.2.2 + spring-data-mongodb-1.3.0 + Spring-data-1.5 + mongodb2.7.3
说 明:Springmvc整合Mongodb的时候建议选择稳定版的Spring-data-mongdb。Mongodb1.0.1中存在数据映射bug.所以使用1.3.0.
项目结构图:
说明:
持久层操作使用MongoTemplate类操作.实现将对象与Mongodb库中的数据交互操作.
这里需要说明的是我的实体对象中的id属性对应的是库中记录中的_id属性.
Mongodb与SpringMVC整合参见文档: http://www.linuxidc.com/Linux/2015-02/114229.htm
Mongodb的高级操作:
添加对象到数据库
/**
* 保存一个对象
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:37:28
*
* @param t
* @return
*/
public void save(T t){
log.info("[Mongo Dao ]save:" + t);
this.mongoTemplate.save(t);
}
根据Id从库中查询对象
/**
* 根据Id从Collection中查询对象
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-17 下午01:59:55
*
* @param id
* 实体对象的Id,对应Collection中记录的_id字段.
* <p>
* 需要说明的是,Mongdo自身没有主键自增机制.解决方法
* <ol>
* <li>实体入库的时候,程序中为实体赋主键值.
* <li>实体入库的时候,在mongodb中自定义函数实现主键自增机制.定义方法同js代码类似
* </ol>
* </p>
* @return
*/
public T queryById(String id) {
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(id);
query.addCriteria(criteria);
log.info("[Mongo Dao ]queryById:" + query);
return this.mongoTemplate.findOne(query, this.getEntityClass());
}
根据条件从库中查询
/**
* 根据条件查询集合
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:32:54
*
* @param query
* 查询条件
* @return
* 满足条件的集合
*/
public List<T> queryList(Query query){
log.info("[Mongo Dao ]queryList:" + query);
return this.mongoTemplate.find(query, this.getEntityClass());
}
根据条件查询单个记录
/**
* 通过条件查询单个实体
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:33:12
*
* @param query
* @return
*/
public T queryOne(Query query){
log.info("[Mongo Dao ]queryOne:" + query);
return this.mongoTemplate.findOne(query, this.getEntityClass());
}
说明:查询单个用的是mongoTemplate.findOne方法,查询多条的用的是mongoTemplate.find.
分页查询操作
/**
* 通过条件进行分页查询
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:33:30
*
* @param query
* 查询条件
* @param start
* 查询起始值
* <strong> 类似mysql查询中的 limit start, size 中的 start</strong>
* @param size
* 查询大小
* <strong> 类似mysql查询中的 limit start, size 中的 size</strong>
* @return
* 满足条件的集合
*/
public List<T> getPage(Query query, int start, int size){
query.skip(start);
query.limit(size);
log.info("[Mongo Dao ]queryPage:" + query + "(" + start +"," + size +")");
List<T> lists = this.mongoTemplate.find(query, this.getEntityClass());
return lists;
}
/**
* 根据条件查询库中符合记录的总数,为分页查询服务
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:35:44
*
* @param query
* 查询条件
* @return
* 满足条件的记录总数
*/
public Long getPageCount(Query query){
log.info("[Mongo Dao ]queryPageCount:" + query);
return this.mongoTemplate.count(query, this.getEntityClass());
}
根据Id删除操作
/**
* 根据Id删除用户
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午04:09:20
*
* @param id
*/
public void deleteById(String id) {
Criteria criteria = Criteria.where("_id").in(id);
if(null!=criteria){
Query query = new Query(criteria);
log.info("[Mongo Dao ]deleteById:" + query);
if(null!=query && this.queryOne(query)!=null){
this.delete(query);
}
}
}
删除对象操作
/**
* 删除对象
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:45:33
*
* @param t
*/
public void delete(T t){
log.info("[Mongo Dao ]delete:" + t);
this.mongoTemplate.remove(t);
}
修改操作:
说明:Mongodb的修改操作大致有3中.
mongoTemplate.updateFirst操作、mongoTemplate.updateMulti操作、this.mongoTemplate.upsert操作.
分别表示修改第一条、修改符合条件的所有、修改时如果不存在则添加.
修改满足条件的第一条记录
/**
* 更新满足条件的第一个记录
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:47:10
*
* @param query
* @param update
*/
public void updateFirst(Query query,Update update){
log.info("[Mongo Dao ]updateFirst:query(" + query + "),update(" + update + ")");
this.mongoTemplate.updateFirst(query, update, this.getEntityClass());
}
修改满足条件的多条记录
/**
* 更新满足条件的所有记录
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:48:02
*
* @param query
* @param update
*/
public void updateMulti(Query query, Update update){
log.info("[Mongo Dao ]updateMulti:query(" + query + "),update(" + update + ")");
this.mongoTemplate.updateMulti(query, update, this.getEntityClass());
}
修改,如果要修改的对象不存在则添加
/**
* 查找更新,如果没有找到符合的记录,则将更新的记录插入库中
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午03:48:58
*
* @param query
* @param update
*/
public void updateInser(Query query, Update update){
log.info("[Mongo Dao ]updateInser:query(" + query + "),update(" + update + ")");
this.mongoTemplate.upsert(query, update, this.getEntityClass());
}
上面的操作是Mongodb的基础操作封装,利用泛型实现的抽象类MongoGenDao.java,泛型中定义钩子方法,然后Dao类继承抽象类,实现该钩子方法,返回反射的类型.钩子方法的定义如下:
/**
* 钩子方法,由子类实现返回反射对象的类型
*
* @author <a href='mailto:dennisit@163.com'>Cn.pudp(En.dennisit)</a> Copy Right since 2013-10-13 下午03:21:48
*
* @return
*/
protected abstract Class<T> getEntityClass();
Mongodb基础操作封装大致就这么多
接下来介绍如何在数据Dao中根据需要复写我们的持久层基础操作.实例是会员管理的基础实现.
package com.pudp.dao;
import java.util.List;
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 org.springframework.stereotype.Repository;
import com.pudp.base.MongoGenDao;
import com.pudp.model.Member;
import com.pudp.util.StringUtil;
/**
* description:
*
* @author <a href='mailto:dennisit@163.com'> Cn.苏若年 (En.dennisit)</a> Copy Right since 2013-10-13
*
* com.pudp.dao.MemberDao.java
*
*/
@Repository
public class MemberDao extends MongoGenDao<Member>{
/**
* 分页查询 对应mongodb操作中的 db.member.find().skip(10).limit(10);
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-13 下午04:09:58
*
* @param member
* 查询的条件
* @param start
* 用户分页查询的起始值
* @param size
* 查询的数据数目
*
* @return
* 返回查询到的数据集合
*/
public List<Member> queryPage(Member member, Integer start, Integer size) {
Query query = new Query();
//此处可以增加分页查询条件Criteria.然后query.addCriteria(criteria);
return this.getPage(query,(start-1)*size,size);
}
/**
* 查询满足分页的记录总数
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-16 上午10:20:12
*
* @param member
* 查询的条件
* @return
* 返回满足条件的记录总数
*/
public Long queryPageCount(Member member){
Query query = new Query();
//此处可以增加分页查询条件Criteria.然后query.addCriteria(criteria);
return this.getPageCount(query);
}
/**
* 更新操作
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-17 下午02:21:26
*
* @param member
* 要更新的数据
* @throws Exception
* 更新异常
*/
public void updateFirst(Member member) throws Exception {
Update update = new Update();
if(null==member.getId()||"".equals(member.getId().trim())){
//如果主键为空,则不进行修改
throw new Exception("Update data Id is Null");
}
if(StringUtil.isNotNullValue(member.getUsername())){
update.set("username", member.getUsername());
}
if(StringUtil.isNotNullValue(member.getPassword())){
update.set("password", member.getPassword());
}
if(StringUtil.isNotNullValue(member.getSex())){
update.set("sex", member.getSex());
}
if(StringUtil.isNotNullValue(member.getEmail())){
update.set("email", member.getEmail());
}
this.updateFirst(Query.query(Criteria.where("_id").is(member.getId())),update);
}
/**
* 更新库中所有数据
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-17 下午02:22:07
*
* @param member
* 更新的数据
* @throws Exception
* 更新异常
*/
public void updateMulti(Member member) throws Exception {
Update update = new Update();
if(null==member.getId()||"".equals(member.getId().trim())){
//如果主键为空,则不进行修改
throw new Exception("Update data Id is Null");
}
if(StringUtil.isNotNullValue(member.getUsername())){
update.set("username", member.getUsername());
}
if(StringUtil.isNotNullValue(member.getPassword())){
update.set("password", member.getPassword());
}
if(StringUtil.isNotNullValue(member.getSex())){
update.set("sex", member.getSex());
}
if(StringUtil.isNotNullValue(member.getEmail())){
update.set("email", member.getEmail());
}
this.updateMulti(Query.query(Criteria.where("_id").is(member.getId())),update);
}
/**
* 实现钩子方法,返回反射的类型
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-17
*
* @return
* 反射类型
*/
@Override
protected Class<Member> getEntityClass() {
return Member.class;
}
}
业务层调用Dao进行业务数据的交互.这里列出实例中的Service层中对持久层分页操作的实现
/**
* 分页查询
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-10-17
*
* @param member
* 查询的条件
* @param start
* 对应<code>Page</code>工具类的属性当前页:pageNum
* @param size
* 对应<code>Page</code>工具类的属性每页显示多少条记录:pageSize
* @return
*/
public Page<Member> queryPage(Member member, int start, int size) {
Page<Member> page = new Page<Member>();
try {
List<Member> list = this.memberDao.queryPage(member, start, size);
Long recordTotal = this.memberDao.queryPageCount(member);
page= new Page<Member>(list, recordTotal, (long)start, size);
log.info(page);
} catch (Exception e) {
e.printStackTrace();
}
return page;
}
至此,SpringMVC整合mongodb的高级操作实例完毕,实例中使用jquery.Pager插件分页. 这个属于分页插件的应用,就不介绍了.
运行效果图:
MongoDB 的详细介绍:请点这里
MongoDB 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-02/114229.htm
https://www.mongodb.org/downloads#production
相关推荐
sudo vim /etc/yum.repos.d/mongodb-org-4.2.repo 写入: [mongodb-org-4.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/ gpgcheck=1 enabled=1 gpg...
MongoDB是一款开源、分布式、高性能的NoSQL数据库,它不使用传统的表格和列式结构来存储数据,而是采用键值对、文档、集合和图形数据模型。这种设计使得MongoDB在处理非结构化和半结构化数据时表现出色,特别适合大...
MongoDB是一种流行的开源、分布式文档数据库,常被用于构建高性能、可扩展的应用程序。这个“mongodb-测试数据”压缩包显然包含了一些用于测试MongoDB功能的样例数据集,特别是针对增、删、改、查(CRUD)操作的学习...
/usr/local/mongodb/mongodb-linux-2.0.7/bin/mongod --dbpath=/usr/local/mongodb/data/db --logpath=/usr/local/mongodb/mongodb-linux-2.0.7/logs/mongodb.log --logappend --port=27017 --fork 知识点 6:配置...
Spring Data MongoDB是一个强大的Java库,它为开发人员提供了一种简单的方式来访问和操作MongoDB数据库。这个库是Spring Data框架的一部分,旨在简化数据访问层的实现,尤其在使用NoSQL数据库如MongoDB时。MongoDB...
MongoDB 实验报告 本实验报告旨在详细介绍 MongoDB 的安装、配置和基本操作步骤,本报告基于 CentOS 7 系统,通过一步一步的截图和文字说明,帮助读者快速掌握 MongoDB 的使用。 一、安装 MongoDB 首先,我们需要...
MongoDB之conf配置文件详解 MongoDB的配置文件是服务器的核心组件之一,它控制着MongoDB服务器的各种设置和行为。在本文中,我们将详细介绍MongoDB的配置文件的各个部分,并解释每个设置的作用和意义。 一、数据库...
MongoDB 是一个流行的开源、基于分布式文件存储的数据库系统,主要设计用于处理大量数据的分布式环境。C# 驱动是 MongoDB 提供的一种客户端库,允许 .NET 开发者与 MongoDB 数据库进行交互。标题提到的是 MongoDB 的...
MongoDB是一个开源、分布式、高性能的NoSQL数据库,以其灵活性、可扩展性和高可用性而闻名。`mongodb.dll`是MongoDB数据库系统在Windows平台上运行所必需的一个动态链接库(DLL)文件,它包含了MongoDB客户端和...
Geoserver发布MongoDB矢量数据地图服务 Geoserver是一款功能强大且开源的地理信息系统(GIS)服务器,能够实现空间数据的存储、处理和发布。MongoDB是一款NoSQL数据库,能够存储大量的矢量数据。本文将介绍如何使用...
资源名称:MongoDB应用设计模式内容简介:无论是在构建社交媒体网站,还是在开发一个仅在内部使用的企业应用程序,《MongoDB应用设计模式》展示了MongoDB需要解决的商业问题之间的连接。你将学到如何把MongoDB设计...
MongoDB Community Server(mongodb-org-server_5.0.4_amd64.deb)适用于适用于Debian10 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是...
MongoDB是一个流行的开源、分布式文档型数据库,设计用于处理大量数据并提供高可用性和高性能。在Java应用程序中,为了与MongoDB进行交互,我们需要使用Java MongoDB驱动程序。这个压缩包包含的就是Java连接MongoDB...
MongoDB是一款高性能、无模式的分布式文档型数据库,被广泛应用于大数据分析、内容管理系统、物联网(IoT)、实时应用程序和地理位置数据存储等场景。在Linux环境下安装MongoDB 4.2.21版本,是许多系统管理员和开发者...
MongoDB Community Server(mongodb-linux-aarch64-ubuntu1804-5.0.8.tgz)适用于Ubuntu 18.04 Arm芯片, MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决...
MongoDB Community Server(mongodb-src-r5.0.4.tar.gz)源代码 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非...
MongoDB是一种流行的开源、分布式文档型数据库,以其灵活性、高性能和可伸缩性而闻名。在C#开发环境中,MongoDB提供了专门的C#驱动程序,使得开发者能够方便地与MongoDB进行交互。本篇文章将深入探讨MongoDB的C#驱动...
MongoDB 是一个高性能的NoSQL数据库,以分布式文件存储为基础,提供灵活的数据模型和高效的查询操作。MongoDB 不同于传统的关系型数据库,它采用面向集合的存储方式,支持无模式的数据模型,允许数据自由组织,这...
MongoDB 是一个流行的开源文档型数据库,被广泛用于存储、管理和检索非结构化或半结构化数据。在本文中,我们将深入探讨如何在基于ARM架构的Ubuntu 18.04系统上安装和使用MongoDB。 一、ARM架构与Ubuntu 18.04 ARM...
MongoDB是一种分布式文档数据库,以其灵活性、高性能和可伸缩性而闻名,尤其适用于处理大量半结构化和非结构化数据。MongoDB Day 2015 深圳活动显然是一个专门针对MongoDB技术的研讨会或会议,旨在深入探讨和分享...