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

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

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.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> 

实体

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;

}
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());

	}

}

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

转载于:https://my.oschina.net/shyloveliyi/blog/1536648

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,如果你使用 Spring Boot Starter Data MongoDB,那么在使用 MongoTemplate 之前,需要配置 MongoTemplate。在 Spring Boot 中,可以通过在配置类上添加注解 `@EnableMongoRepositories` 来启用 MongoDB 集成。 以下是一个简单的配置类示例,它定义了一个名为 mongoTemplateMongoTemplate bean: ``` @Configuration @EnableMongoRepositories(basePackages = "com.example.mongo.repositories") public class MongoConfig extends AbstractMongoClientConfiguration { @Value("${spring.data.mongodb.uri}") private String connectionString; @Value("${spring.data.mongodb.database}") private String dbName; @Override public MongoClient mongoClient() { ConnectionString connString = new ConnectionString(connectionString); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(connString) .build(); return MongoClients.create(settings); } @Override protected String getDatabaseName() { return dbName; } @Bean public MongoTemplate mongoTemplate() throws Exception { return new MongoTemplate(mongoClient(), getDatabaseName()); } } ``` 在这个例子中,我们使用 `@EnableMongoRepositories` 注解来启用 MongoDB 集成,并指定了存储库接口的基本包名称。在 `mongoClient()` 方法中,我们创建了一个 MongoDB 客户端并返回它。在 `mongoTemplate()` 方法中,我们创建了一个名为 mongoTemplateMongoTemplate bean。这个 bean 可以直接在你的代码中注入并使用。 注意,这里我们继承了 `AbstractMongoClientConfiguration` 类,这是因为它提供了一些默认的配置,例如自动配置了 MongoClient 和 MongoDatabaseFactory。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值