spring封装mongodb的代码实现
众所周知,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的代码实现相关推荐
- Spring boot mongodb
mongodb语法 spring boot mongodb 引入 pom依赖 <dependencies><dependency><groupId>org.spri ...
- spring整合mongodb集群
2019独角兽企业重金招聘Python工程师标准>>> 先看一下Spring对MongoDB的配置文件mongo.xml: <?xml version="1.0&qu ...
- Spring data mongodb实现LBS
基本介绍 位置服务(LBS)解决的主要问题是当前位置周围某个范围内的人或场所. 在传统的解决方案,开发人员需要根据复杂的几何运算与大量的SQL语句进行查找,这无疑加大的开发人员的开发难度. 现在我们需 ...
- SpringBoot 集成 Spring Data Mongodb 操作 MongoDB 详解
一.MongoDB 简介 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,且与关系数据库的最为相像的.它支持的数据结构非常松散,是类似 json 的 bso ...
- Spring认证中国教育管理中心-Spring Data MongoDB教程五
原标题:Spring认证中国教育管理中心-Spring Data MongoDB教程五(内容来源:Spring中国教育管理中心) 11.6.5.GeoJSON 支持 MongoDB 支持GeoJSON ...
- Spring Data MongoDB 学习和使用
1.准备环境 新建一个Springboot项目 点击finish完成项目的搭建 2.配置连接参数 # application.properties # 配置数据库连接 #格式: mongodb://账 ...
- Day 22: 使用Spring、MongoDB和AngularJS开发单页面应用
今天的<30天学习30种新技术>挑战,我决定使用Spring框架.MongoDB和AngularJS开发一个单页面应用.我很熟悉Spring和MongoDB,但是我没用配合Spring使用 ...
- Spring Boot MongoDB 入门
1. 概述 可能有一些胖友对 MongoDB 不是很了解,这里我们引用一段介绍: FROM <分布式文档存储数据库 MongoDB> MongoDB 是一个介于关系数据库和非关系数据库之间 ...
- Spring整合Mongodb,Maven的依赖,Spring配置,MongoDB的公共操作类,使用SpringMVC的Controller进行测试并返回结果的案例
在和Spring和MongoDB进行整合的时候需要如下三个jar,分别是: spring-data-commons spring-data-mongodb mongo-java-driver 下面讲解 ...
最新文章
- 问题集锦(41-42)
- Centos7 安装 nginx 服务器的两种方式
- UI设计:掌握这6点,轻松0到1
- 04--MySQL自学教程:数据库MySQL--【数据库DB】和【数据库管理系统DBMS】简介
- Fedora 35安装 VMware Workstation 16.1.2并解决报错:efore you can run VMware several modules must be compiled
- 上海交大张拳石:神经网络的变量交互可解释性研究
- SSL 1624——小萨的烦恼【最短路】【枚举】
- python解决列表IndexError: list index out of range
- 解决 Laravel/Lumen 出现 Please provide a valid cache path 问题
- Math工具类的使用
- 关于下载的wide形式的数据(横轴为地区,纵轴为年份)批量转换为long形式的代码(stata版)
- java fadein_jQuery fadeIn()和fadeOut()方法
- “use strict” 严格模式使用
- 第三方支付竞争走向下半场 汇付天下构建多方共赢新生态
- 【博客学习之旅】仰望星空,脚踏实地
- Qt 使用QMovie加载gif图片实现动态等待窗口
- 单击Artwork时没有弹窗的问题
- YOLOv5-Lite:NCNN+Int8部署和量化,树莓派也可实时
- python 支付宝接口_python实现支付宝转账接口
- Python、C、Java 和 C++ 四足鼎立,其他已无胜算? | TIOBE 10 月编程语言排行榜
热门文章
- 为什么Wait和notify方法在Object中?
- 酷冷至尊masterkeys xt v2如何宏编程
- 如火如荼的国产数据库,能否替换Oracle数据库?
- QT QTableView QTableWidget 复杂表头(多行表头) 、(冻结、固定特定的行)
- C++/Python PAT 乙级 1039 到底买不买(20)
- rabbitMQ 3.7.25安装部署
- 618战报喜人,但客户服务的硬仗面临这些挑战
- 给hexo个人博客 next主题添加背景图片
- AJAX和JSON详解
- 音频均衡器Equalizer算法研究与实现