前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring-data-mongodb使用mongoTemplate开发示例

spring-data-mongodb使用mongoTemplate开发示例

作者头像
尚浩宇
发布2018-08-17 11:16:00
6.1K0
发布2018-08-17 11:16:00
举报
文章被收录于专栏:杂烩

使用mongoTemplate比直接定义接口不用写实现那种复杂点,但有时候在一些特殊操作上,可能使用mongoTemplate更容易些。以下记录以下使用mongoTemplate简单开发示例,包含插入、修改、计算总数、分组统计、日期范围查询等。

mongodb.xml

代码语言:javascript
复制
<?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.8.xsd   
          http://www.springframework.org/schema/beans   
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 带密码	<mongo:mongo-client id="mongoClient" host="${mongo.host}" port="${mongo.port}"
		credentials="${mongo.username}:${mongo.password}@${mongo.dbname}"> -->
	<mongo:mongo-client id="mongoClient" host="${mongo.host}" port="${mongo.port}">
		<mongo:client-options write-concern="SAFE" connections-per-host="${mongo.connectionsPerHost}"
			threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
			connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}" socket-timeout="${mongo.socketTimeout}" />
	</mongo:mongo-client>

	<mongo:db-factory id="mongoDbFactory" dbname="${mongo.dbname}" mongo-ref="mongoClient" />

	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
		<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
	</bean>
</beans> 

实体

代码语言:javascript
复制
package com.voole.trdpay.entry.order;

import java.io.Serializable;
import java.util.Date;

import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import com.voole.trdpay.vo.PageMessageVo;

/**
 * @ClassName: Oerder
 * @Description: TODO(这里用一句话描述这个类的作用)
 * 
 * @date 2017年9月8日 上午11:09:35
 * 
 */
@Document(collection = "order")
public class OrderEntry implements Serializable {
	/**
	 * @Fields serialVersionUID : TODO(用一句话描述这个变量表示什么)
	 * @author shangchengcai@voole.com
	 * @date 2017年9月8日 上午11:14:59
	 */
	private static final long serialVersionUID = 5389285057782164927L;
	@Id
	private String id;// '主键',
	private String oemid;// '设备编号',
	private String hid;// 'hid',
	private String uid;// 'uid',
	private String order_name;// '订单名称',
	private String order_type;// '订单类型0单点1套餐',
	private Long amt;// '金额',
	@Indexed
	private String orderNum;// '订单号',
	private String respcd;// '回调交易结果',
	private String channelOrderNum;// '渠道交易号',
	private String consumerAccount;// '用户账号',
	private String consumerId;// '渠道账号 ID',
	private String errorDetail;// '错误信息',
	private Date transTime;// '交易时间',
	private Date qr_transTime;// '交易时间',
	private Date aply_transTime;// '交易时间',
	private Date cancel_transTime;// '交易时间',
	private String qrcode;// '二维码信息',
	private String order_status;// '订单状态',
	private Date create_time;// '创建时间',
	private String chcdDiscount;// 渠道优惠
	private String merDiscount;// 商户优惠
	private String bankType;// 银行标识用户银行标识
	private String origOrderNum;// 原订单号
	private String chcd;// 支付渠道
	private String version;
	@Transient
	private PageMessageVo pmv;
	@Transient
	private Date queryStart;
	@Transient
	private Date queryEnd;

}
代码语言:javascript
复制
package com.voole.trdpay.dao.order.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
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.mongodb.WriteResult;
import com.voole.trdpay.dao.order.IOrderDao;
import com.voole.trdpay.entry.order.OrderEntry;
import com.voole.trdpay.vo.order.CountVo;

/**
 * @ClassName: OrderDaoImpl
 * @Description: TODO(这里用一句话描述这个类的作用)
 * 
 * @date 2017年9月8日 下午1:14:24
 * 
 */
@Repository
public class OrderDaoImpl implements IOrderDao {
	private static final Logger LOGGER = Logger.getLogger(OrderDaoImpl.class);
	@Resource
	private MongoTemplate mongoTemplate;

	/*
	 * (非 Javadoc) <p>Title: insert</p> <p>Description: </p>
	 * 
	 * @param oe
	 * 
	 * @see com.voole.trdpay.dao.order.IOrderDao#insert(com.voole.trdpay.entry.order.OrderEntry)
	 */
	@Override
	public void insert(OrderEntry oe) {
		this.mongoTemplate.insert(oe);
	}

	/*
	 * (非 Javadoc) <p>Title: findByOrderNum</p> <p>Description: </p>
	 * 
	 * @param orderNum
	 * 
	 * @return
	 * 
	 * @see com.voole.trdpay.dao.order.IOrderDao#findByOrderNum(java.lang.String)
	 */
	@Override
	public OrderEntry findByOrderNum(String orderNum) {
		Query query = new Query();
		query.addCriteria(Criteria.where("orderNum").is(orderNum));
		return this.mongoTemplate.findOne(query, OrderEntry.class);
	}

	/*
	 * (非 Javadoc) <p>Title: updateOrInsert</p> <p>Description: </p>
	 * 
	 * @param oe
	 * 
	 * @see com.voole.trdpay.dao.order.IOrderDao#updateOrInsert(com.voole.trdpay.entry.order.OrderEntry)
	 */
	@Override
	public void updateOrInsertForAply(OrderEntry oe) {
		Query query = new Query();
		query.addCriteria(Criteria.where("orderNum").is(oe.getOrderNum()));
		Update update = new Update();
		update.set("chcdDiscount", oe.getChcdDiscount());
		update.set("merDiscount", oe.getMerDiscount());
		update.set("bankType", oe.getBankType());
		update.set("channelOrderNum", oe.getChannelOrderNum());
		update.set("consumerAccount", oe.getConsumerAccount());
		update.set("aply_transTime", oe.getAply_transTime());
		update.set("transTime", oe.getTransTime());
		update.set("order_status", oe.getOrder_status());
		update.set("respcd", oe.getRespcd());
		update.set("errorDetail", oe.getErrorDetail());
		this.mongoTemplate.upsert(query, update, oe.getClass());
	}

	/*
	 * (非 Javadoc) <p>Title: updateOrInsertForCancel</p> <p>Description: </p>
	 * 
	 * @param oe
	 * 
	 * @see com.voole.trdpay.dao.order.IOrderDao#updateOrInsertForCancel(com.voole.trdpay.entry.order.OrderEntry)
	 */
	@Override
	public void updateOrInsertForCancel(OrderEntry oe) {
		Query query = new Query();
		query.addCriteria(Criteria.where("orderNum").is(oe.getOrigOrderNum()));
		Update update = new Update();
		update.set("order_status", oe.getOrder_status());
		update.set("errorDetail", oe.getErrorDetail());
		update.set("orderNum", oe.getOrderNum());
		update.set("origOrderNum", oe.getOrigOrderNum());
		update.set("respcd", oe.getRespcd());
		update.set("cancel_transTime", oe.getCancel_transTime());
		this.mongoTemplate.upsert(query, update, oe.getClass());
	}

	/*
	 * (非 Javadoc) <p>Title: queryOrder</p> <p>Description: </p>
	 * 
	 * @param orderVo
	 * 
	 * @return
	 * 
	 * @see com.voole.trdpay.dao.order.IOrderDao#queryOrder(com.voole.trdpay.vo.order.OrderVo)
	 */
	@Override
	public List<OrderEntry> queryOrder(OrderEntry orderEntry) {
		Query query = new Query();
		if (StringUtils.isNotBlank(orderEntry.getOemid())) {
			query.addCriteria(Criteria.where("oemid").is(orderEntry.getOemid()));
		}
		if (StringUtils.isNotBlank(orderEntry.getHid())) {
			query.addCriteria(Criteria.where("hid").is(orderEntry.getHid()));
		}
		if (StringUtils.isNotBlank(orderEntry.getUid())) {
			query.addCriteria(Criteria.where("uid").is(orderEntry.getUid()));
		}
		if (StringUtils.isNotBlank(orderEntry.getOrderNum())) {
			query.addCriteria(Criteria.where("orderNum").is(orderEntry.getOrderNum()));
		}
		if (StringUtils.isNotBlank(orderEntry.getOrder_status())) {
			query.addCriteria(Criteria.where("order_status").is(orderEntry.getOrder_status()));
		}
		if (StringUtils.isNotBlank(orderEntry.getOrder_type())) {
			query.addCriteria(Criteria.where("order_type").is(orderEntry.getOrder_type()));
		}
		if (StringUtils.isNotBlank(orderEntry.getChcd())) {
			query.addCriteria(Criteria.where("chcd").is(orderEntry.getChcd()));
		}
		if (StringUtils.isNotBlank(orderEntry.getOrigOrderNum())) {
			query.addCriteria(Criteria.where("origOrderNum").is(orderEntry.getOrigOrderNum()));
		}
		if (null != orderEntry.getQueryStart() && null != orderEntry.getQueryEnd()) {
			query.addCriteria(
					Criteria.where("transTime").gte(orderEntry.getQueryStart()).lte(orderEntry.getQueryEnd()));
		}
		query.with(new Sort(Direction.DESC, "transTime"));
		if (orderEntry.getPmv() != null) {
			if (null != orderEntry.getPmv().getiDisplayStart()) {
				query.skip(orderEntry.getPmv().getiDisplayStart().intValue());
			}
			if (null != orderEntry.getPmv().getiDisplayLength()) {
				query.limit(orderEntry.getPmv().getiDisplayLength().intValue());
			}
		}
		return this.mongoTemplate.find(query, OrderEntry.class);
	}

	/*
	 * (非 Javadoc) <p>Title: queryOrderCount</p> <p>Description: </p>
	 * 
	 * @param orderEntry
	 * 
	 * @return
	 * 
	 * @see com.voole.trdpay.dao.order.IOrderDao#queryOrderCount(com.voole.trdpay.entry.order.OrderEntry)
	 */
	@Override
	public Long queryOrderCount(OrderEntry orderEntry) {
		Query query = new Query();
		if (StringUtils.isNotBlank(orderEntry.getOemid())) {
			query.addCriteria(Criteria.where("oemid").is(orderEntry.getOemid()));
		}
		if (StringUtils.isNotBlank(orderEntry.getHid())) {
			query.addCriteria(Criteria.where("hid").is(orderEntry.getHid()));
		}
		if (StringUtils.isNotBlank(orderEntry.getUid())) {
			query.addCriteria(Criteria.where("uid").is(orderEntry.getUid()));
		}
		if (StringUtils.isNotBlank(orderEntry.getOrderNum())) {
			query.addCriteria(Criteria.where("orderNum").is(orderEntry.getOrderNum()));
		}
		if (StringUtils.isNotBlank(orderEntry.getOrder_status())) {
			query.addCriteria(Criteria.where("order_status").is(orderEntry.getOrder_status()));
		}
		if (StringUtils.isNotBlank(orderEntry.getOrder_type())) {
			query.addCriteria(Criteria.where("order_status").is(orderEntry.getOrder_type()));
		}
		if (StringUtils.isNotBlank(orderEntry.getChcd())) {
			query.addCriteria(Criteria.where("chcd").is(orderEntry.getChcd()));
		}
		if (StringUtils.isNotBlank(orderEntry.getOrigOrderNum())) {
			query.addCriteria(Criteria.where("origOrderNum").is(orderEntry.getOrigOrderNum()));
		}
		if (null != orderEntry.getQueryStart() && null != orderEntry.getQueryEnd()) {
			query.addCriteria(
					Criteria.where("transTime").gte(orderEntry.getQueryStart()).lte(orderEntry.getQueryEnd()));
		}
		return this.mongoTemplate.count(query, OrderEntry.class);
	}

	/*
	 * (非 Javadoc) <p>Title: getTodayReceipt</p> <p>Description: </p>
	 * 
	 * @return
	 * 
	 * @see com.voole.trdpay.dao.order.IOrderDao#getTodayReceipt()
	 */
	@Override
	public Double getTodayReceipt(boolean istoday) {
		Long receipt = 0L;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			String todaystart = sdf.format(new Date()) + " 00:00:00";
			String todayebd = sdf.format(new Date()) + " 23:59:59";
			Criteria matchCriteria = Criteria.where("order_status").is("1");
			if (istoday) {
				matchCriteria.and("create_time").gte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(todaystart))
						.lte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(todayebd));
			}
			Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(matchCriteria),
					Aggregation.group("version").sum("amt").as("receipt"));
			/* 查看Group结果 */
			AggregationResults<CountVo> ar = this.mongoTemplate.aggregate(aggregation, "order", CountVo.class); // 执行
																												// aggregation命令
			List<CountVo> list = ar.getMappedResults();
			if (list.size() > 0) {
				receipt = list.get(0).getReceipt();
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return new Double(receipt / 100.00 + "");
	}

	/*
	 * (非 Javadoc) <p>Title: getTodayTotal</p> <p>Description: </p>
	 * 
	 * @return
	 * 
	 * @see com.voole.trdpay.dao.order.IOrderDao#getTodayTotal()
	 */
	@Override
	public Double getTodayTotal(boolean istoday) {
		Long total = 0L;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			String todaystart = sdf.format(new Date()) + " 00:00:00";
			String todayebd = sdf.format(new Date()) + " 23:59:59";
			Criteria matchCriteria = Criteria.where("order_status").in("1", "2");
			if (istoday) {
				matchCriteria.and("create_time").gte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(todaystart))
						.lte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(todayebd));
			}
			Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(matchCriteria),
					Aggregation.group("version").sum("amt").as("total"));
			/* 查看Group结果 */
			AggregationResults<CountVo> ar = this.mongoTemplate.aggregate(aggregation, "order", CountVo.class); // 执行
																												// aggregation命令
			List<CountVo> list = ar.getMappedResults();
			if (list.size() > 0) {
				total = list.get(0).getTotal();
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return new Double(total / 100.00 + "");
	}

	/*
	 * (非 Javadoc) <p>Title: deleteTrashData</p> <p>Description: </p>
	 * 
	 * @see com.voole.trdpay.dao.order.IOrderDao#deleteTrashData()
	 */
	@Override
	public void deleteTrashData() {
		Query query = new Query();
		query.addCriteria(Criteria.where("order_status").is("0").and("create_time")
				.regex(new SimpleDateFormat("yyyy-MM-dd").format(new Date(new Date().getTime() - 86400000L))));
		WriteResult ret = this.mongoTemplate.remove(query, OrderEntry.class);
		LOGGER.info("delete data size:" + ret.getN());

	}

}

(注:代码里有些敏感信息,时间仓促,就不去了,自动忽略即可)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/09/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档