众所周知,spring集成的一些nosql或者sql数据库,都习惯用xxxxTemplate。一般看到xxxxTemplate,我们就可以认为是spring集成的。要和原生的使用方式区分开来。这里,我们不讨论在java项目中原生的mongodb的使用方式,单讨论spring提供的mongodb的封装。

在此之前,我们有必要了解下mongodb的数据存储格式。我一般用json格式存储,结构如下代码所示。如何查看mongodb的数据,可以使用mongoVUE工具。我们可以在Mongodb中存储数亿级别的这种数据而不影响效率。提醒一下:Mongodb不适合按照多条件查询,我们一般用id值来做查询。多条件查询时需要建索引,而且容易把库查死。

{"_id" : "123456789","_class" : "com.OrderInfo","historyId" : "123456789_1_2","orderId" : NumberLong("123456789"),"orderDirection" : "正向","overStatus" : "已完成","orgArea" : "华北","org" : "总公司","orderType" : "一般订单","paymentType" : "货到付款","paymentTpyeGroup" : "后款","orderPrice" : 0.0,"duePrice" : 0.0,"payPrice" : 1000.0,"tuiKuanPrice" : 0.0,"diffPrice" : -1000.0,"memberId" : "testlzg","laiyuan" : "站点","invoicePutType" : "未开票","operationTime" : "20190104160726","status" : "完成","carrier" : "测试操作单位","ttsj" : "20190104160726","waybillSign" : "300000000000000","operateNodeSystem" : "站点-妥投","bizNodeType" : "站点","bizNodeName" : "测试操作单位","bizNodeCode" : "910","belongSystem" : "TMS","systemCode" : "josl","operater" : "张三","operaterErp" : "1122","distributeType" : "65","endDate" : "20190104160726","validTag" : "1","orderStatus" : "暂停","duizhangStatus" : "足额对账","updateTime" : ISODate("2016-10-10T03:16:52.068Z"),"orgId" : "6","createTime" : "20161010111636","damagedPrice" : 0.0,"tmplateNode" : "妥投"
}

要想在spring程序中使用mongodb,我们应该怎么做呢。

首先:

引入mongodb的jar包

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-mongodb</artifactId>
</dependency>

当然,如果不使用maven,你有可以单独直接下载spring-data-mongodb-1.3.3.jar引入到你的项目中。

其次:

需要在我们的spring的配置文件中增加Mongodb的配置。

<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/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/data/mongohttp://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><mongo:mongo id="mongo_Test" replica-set="ip1:port1,ip2:port2"><!--配置mongodb服务器和端口,这里是基于复制级的,可以配置一主多从--><mongo:options connections-per-host="100"threads-allowed-to-block-for-connection-multiplier="4"connect-timeout="2000"max-wait-time="3000"auto-connect-retry="true"socket-keep-alive="true"socket-timeout="10000"slave-ok="true"write-number="1"write-timeout="0"write-fsync="false"/> <!--控制数据写的时候,是否刷新完磁盘返回--></mongo:mongo><mongo:db-factory id="mongoDbFactoryPrism" dbname="dbname" username="username" password="${password}" mongo-ref="mongo_Test"/><bean id="mongoTemplateTest" class="org.springframework.data.mongodb.core.MongoTemplate"><constructor-arg name="mongoDbFactory" ref="<span style="font-family: Arial, Helvetica, sans-serif;">mongoDbFactoryPrism</span><span style="font-family: Arial, Helvetica, sans-serif;">" /></span>
<property name="writeResultChecking" value="EXCEPTION" /><!--控制mongodb是否抛异常--><property name="writeConcern" value="SAFE" /><!--控制mongodb的安全级别--></bean><bean id="mongoDBCache" class="com..MongoDBCacheImpl"><property name="mongoOperations" ref="mongoTemplateTest"/></bean>
</beans>

这种配置是不是一目了然呢。spring中好多封装配置也就这样,一环扣一环,最后给我们一个可以用的手把,例如 mongoDBCache。

最后:

我们就可以通过实现我们的MongoDBCacheImpl来写我们的业务逻辑了。

public class MongoDBCacheImpl {public void setMongoOperations(MongoOperations mongoOperations) {this.mongoOperations = mongoOperations;}private MongoOperations mongoOperations;
//根据key获取public <T> T getByKey(Object key, Class<T> entityClass) {return mongoOperations.findById(key, entityClass);}public <T> List<T> getByColumn(String columnName, Object columeValue, Class<T> entityClass) {return mongoOperations.find(new Query(Criteria.where(columnName).is(columeValue)), entityClass);}
//保存public void save(Object obj) {mongoOperations.save(obj);}
//移除public void remove(Object obj) {mongoOperations.remove(obj);}public <T> Long getCountByDate(Date beginTime, Date endTime, Class<T> entityClass) {Assert.notNull(beginTime, "beginTime is not null.");Assert.notNull(endTime, "endTime is not null.");Assert.isTrue(endTime.after(beginTime), "endTime must be after beginTime.");return mongoOperations.count(new Query(Criteria.where("createdate").gte(beginTime).and("createdate").lt(endTime)), entityClass);}public <T> List<T> findAllByDate(Date beginTime, Date endTime, Class<T> entityClass) {Assert.notNull(beginTime, "beginTime is not null.");Assert.notNull(endTime, "endTime is not null.");Assert.isTrue(endTime.after(beginTime), "endTime must be after beginTime.");Query query = new Query().addCriteria(Criteria.where("riqi").exists(true).andOperator(Criteria.where("riqi").gte(beginTime),Criteria.where("riqi").lt(endTime)));return mongoOperations.find(query, entityClass);}public <T> List<T> findAllByDateAndColumn(String dateColumnName, Date beginTime, Date endTime, String columnName, Object columeValue, Class<T> entityClass) {Query query = new Query().addCriteria(Criteria.where(dateColumnName).exists(true).andOperator(Criteria.where(dateColumnName).gte(beginTime),Criteria.where(dateColumnName).lt(endTime)).and(columnName).is(columeValue));return mongoOperations.find(query, entityClass);}//统计public <T> Long  getCountByDateAndColumn(String dateColumnName, Date beginTime, Date endTime, String columnName, Object columeValue, Class<T> entityClass) {Query query = new Query().addCriteria(Criteria.where(dateColumnName).exists(true).andOperator(Criteria.where(dateColumnName).gte(beginTime),Criteria.where(dateColumnName).lt(endTime)).and(columnName).is(columeValue));return mongoOperations.count(query,entityClass);}
//分页查询public <T> Pagination<T> getPageListByDateColumn(String dateColumnName, Date beginTime, Date endTime, Pagination<T> page, Class<T> entityClass) {Query query = new Query().addCriteria(Criteria.where(dateColumnName).exists(true).andOperator(Criteria.where(dateColumnName).gte(beginTime),Criteria.where(dateColumnName).lte(endTime)));if (null != page && page.getTotalCount()>0){page.setTotalCount(page.getTotalCount());query.skip(page.getFirstResult());query.limit(page.getPageSize());}else {return null;}List<T> pageData = mongoOperations.find(query,entityClass);page.setDatas(pageData);return page;}
//按照Key更新public <T> void updateByKey(Object key, String updateColumn, Object value, Class<T> entityClass) {Query query = new Query(Criteria.where( "_id" ).is(key));mongoOperations.updateFirst(query,Update.update(updateColumn,value),entityClass);}
//删除指定keypublic <T> void deleteByKey(Object key, Class<T> entityClass) {Query query = new Query(Criteria.where( "_id" ).is(key));mongoOperations.remove(query,entityClass);}
//删除所有public <T> void removeAll(String dateColumnName, Date beginTime, Date endTime, String columnName, Object columeValue, Class<T> entityClass){Query query = new Query().addCriteria(Criteria.where(dateColumnName).exists(true).andOperator(Criteria.where(dateColumnName).gte(beginTime),Criteria.where(dateColumnName).lte(endTime)).and(columnName).is(columeValue));mongoOperations.remove(query,entityClass);}}

至此,我们就可以用mongodb对我们的数据进行增删改查了,对于复制级的mongodb,数据量在3亿以上,更新查询操作也一般在5ms之内。

spring封装mongodb的代码实现相关推荐

  1. Spring boot mongodb

    mongodb语法 spring boot mongodb 引入 pom依赖 <dependencies><dependency><groupId>org.spri ...

  2. spring整合mongodb集群

    2019独角兽企业重金招聘Python工程师标准>>> 先看一下Spring对MongoDB的配置文件mongo.xml: <?xml version="1.0&qu ...

  3. Spring data mongodb实现LBS

    基本介绍 位置服务(LBS)解决的主要问题是当前位置周围某个范围内的人或场所. 在传统的解决方案,开发人员需要根据复杂的几何运算与大量的SQL语句进行查找,这无疑加大的开发人员的开发难度. 现在我们需 ...

  4. SpringBoot 集成 Spring Data Mongodb 操作 MongoDB 详解

    一.MongoDB 简介 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,且与关系数据库的最为相像的.它支持的数据结构非常松散,是类似 json 的 bso ...

  5. Spring认证中国教育管理中心-Spring Data MongoDB教程五

    原标题:Spring认证中国教育管理中心-Spring Data MongoDB教程五(内容来源:Spring中国教育管理中心) 11.6.5.GeoJSON 支持 MongoDB 支持GeoJSON ...

  6. Spring Data MongoDB 学习和使用

    1.准备环境 新建一个Springboot项目 点击finish完成项目的搭建 2.配置连接参数 # application.properties # 配置数据库连接 #格式: mongodb://账 ...

  7. Day 22: 使用Spring、MongoDB和AngularJS开发单页面应用

    今天的<30天学习30种新技术>挑战,我决定使用Spring框架.MongoDB和AngularJS开发一个单页面应用.我很熟悉Spring和MongoDB,但是我没用配合Spring使用 ...

  8. Spring Boot MongoDB 入门

    1. 概述 可能有一些胖友对 MongoDB 不是很了解,这里我们引用一段介绍: FROM <分布式文档存储数据库 MongoDB> MongoDB 是一个介于关系数据库和非关系数据库之间 ...

  9. Spring整合Mongodb,Maven的依赖,Spring配置,MongoDB的公共操作类,使用SpringMVC的Controller进行测试并返回结果的案例

    在和Spring和MongoDB进行整合的时候需要如下三个jar,分别是: spring-data-commons spring-data-mongodb mongo-java-driver 下面讲解 ...

最新文章

  1. 问题集锦(41-42)
  2. Centos7 安装 nginx 服务器的两种方式
  3. UI设计:掌握这6点,轻松0到1
  4. 04--MySQL自学教程:数据库MySQL--【数据库DB】和【数据库管理系统DBMS】简介
  5. Fedora 35安装 VMware Workstation 16.1.2并解决报错:efore you can run VMware several modules must be compiled
  6. 上海交大张拳石:神经网络的变量交互可解释性研究
  7. SSL 1624——小萨的烦恼【最短路】【枚举】
  8. python解决列表IndexError: list index out of range
  9. 解决 Laravel/Lumen 出现 Please provide a valid cache path 问题
  10. Math工具类的使用
  11. 关于下载的wide形式的数据(横轴为地区,纵轴为年份)批量转换为long形式的代码(stata版)
  12. java fadein_jQuery fadeIn()和fadeOut()方法
  13. “use strict” 严格模式使用
  14. 第三方支付竞争走向下半场 汇付天下构建多方共赢新生态
  15. 【博客学习之旅】仰望星空,脚踏实地
  16. Qt 使用QMovie加载gif图片实现动态等待窗口
  17. 单击Artwork时没有弹窗的问题
  18. YOLOv5-Lite:NCNN+Int8部署和量化,树莓派也可实时
  19. python 支付宝接口_python实现支付宝转账接口
  20. Python、C、Java 和 C++ 四足鼎立,其他已无胜算? | TIOBE 10 月编程语言排行榜

热门文章

  1. 为什么Wait和notify方法在Object中?
  2. 酷冷至尊masterkeys xt v2如何宏编程
  3. 如火如荼的国产数据库,能否替换Oracle数据库?
  4. QT QTableView QTableWidget 复杂表头(多行表头) 、(冻结、固定特定的行)
  5. C++/Python PAT 乙级 1039 到底买不买(20)
  6. rabbitMQ 3.7.25安装部署
  7. 618战报喜人,但客户服务的硬仗面临这些挑战
  8. 给hexo个人博客 next主题添加背景图片
  9. AJAX和JSON详解
  10. 音频均衡器Equalizer算法研究与实现