Spring整合MongoDB,封装MongoTemplate常用操作方法

此生再无相见时 提交于 2020-08-11 14:11:19
  1. 所需Jar包
    mongo-java-driver-3.3.0.jar
    spring-data-mongodb-1.10.15.RELEASE.jar 

     

  2. 配置mongodb.properties
    mongo.hostport=127.0.0.1:27017
    mongo.connectionsPerHost=8
    mongo.threadsAllowedToBlockForConnectionMultiplier=4
    mongo.connectTimeout=3000
    mongo.maxWaitTime=1500
    mongo.socketKeepAlive=true
    mongo.socketTimeout=30000
    mongo.authDB=admin # 认证的数据库
    mongo.username=admin
    mongo.password=123456
    mongo.connectDB=project # 需要操作的数据库
    

     

  3. 配置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.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.xsd">
              
        <context:property-placeholder location="classpath:mongodb.properties" ignore-unresolvable="true" />
              
    	<mongo:mongo-client id="mongo" replica-set="${mongo.hostport}" credentials="${mongo.username}:${mongo.password}@${mongo.authDB}">
    		<mongo:client-options
    			connections-per-host="${mongo.connectionsPerHost}"
    			threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
    			connect-timeout="${mongo.connectTimeout}"
    			max-wait-time="${mongo.maxWaitTime}"
    			socket-keep-alive="${mongo.socketKeepAlive}"
    			socket-timeout="${mongo.socketTimeout}" />
    	</mongo:mongo-client>
    
    	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    		<constructor-arg ref="mongo" />
    		<constructor-arg name="databaseName" value="${mongo.connectDB}" />
    	</bean>
    </beans>

封装MongoTemplate常用方法

package com.sys.core.server;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.mongodb.core.CollectionOptions;
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.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.WriteResult;

@Service
public class MongoService {

	@Autowired
	private MongoTemplate mongoTemplate;

	/**
	 * =================================== db/Collection info
	 **/

	/**
	 * 获取数据库信息
	 * 
	 * @return
	 */
	public DB getDb() {

		return mongoTemplate.getDb();
	}

	/**
	 * 获取数据库全部集合名称
	 * 
	 * @return
	 */
	public Set<String> getCollectionNames() {

		return mongoTemplate.getCollectionNames();
	}

	/**
	 * 获取数据库指定名称集合
	 * 
	 * @param collectionName 集合名称
	 * @return
	 */
	public DBCollection getCollection(String collectionName) {

		return mongoTemplate.getCollection(collectionName);
	}

	/**
	 * 获取数据库指定名称集合
	 * 
	 * @param entityClass 集合映射实体
	 * @return
	 */
	public <T> DBCollection getCollection(Class<T> entityClass) {

		String collectionName = mongoTemplate.getCollectionName(entityClass);
		return mongoTemplate.getCollection(collectionName);
	}

	/**
	 * =================================== createCollection
	 **/

	/**
	 * 创建集合
	 * 
	 * @param <T>
	 * @param entityClass 集合映射实体
	 */
	public <T> DBCollection createCollection(Class<T> entityClass) {

		return mongoTemplate.createCollection(entityClass);
	}

	/**
	 * 创建集合
	 * 
	 * @param <T>
	 * @param entityClass       集合映射实体
	 * @param collectionOptions 指定有关内存大小及索引的选项
	 */
	public <T> DBCollection createCollection(Class<T> entityClass, CollectionOptions collectionOptions) {

		DBCollection dbCollection = null;
		if (ObjectUtils.isEmpty(collectionOptions)) {
			dbCollection = mongoTemplate.createCollection(entityClass);
		} else {
			dbCollection = mongoTemplate.createCollection(entityClass, collectionOptions);
		}
		return dbCollection;
	}

	/**
	 * 创建集合
	 * 
	 * @param <T>
	 * @param collectionName 集合名称
	 */
	public DBCollection createCollection(String collectionName) {

		return mongoTemplate.createCollection(collectionName);
	}

	/**
	 * 创建集合
	 * 
	 * @param <T>
	 * @param collectionName    集合名称
	 * @param collectionOptions 指定有关内存大小及索引的选项
	 */
	public <T> DBCollection createCollection(String collectionName, CollectionOptions collectionOptions) {

		DBCollection collection = null;
		if (ObjectUtils.isEmpty(collectionOptions)) {
			collection = mongoTemplate.createCollection(collectionName);
		} else {
			collection = mongoTemplate.createCollection(collectionName, collectionOptions);
		}
		return collection;
	}

	/**
	 * =================================== removeCollection
	 **/

	/**
	 * 删除集合
	 * 
	 * @param entityClass 集合映射实体
	 */
	public <T> void removeCollection(Class<T> entityClass) {

		mongoTemplate.dropCollection(entityClass);
	}

	/**
	 * 删除集合
	 * 
	 * @param collectionName 集合名称
	 */
	public <T> void removeCollection(String collectionName) {

		mongoTemplate.dropCollection(collectionName);
	}

	/**
	 * =================================== insert/save
	 **/

	/**
	 * 新增
	 * 
	 * @param obj 数据对象
	 */
	public void insert(Object obj) {

		mongoTemplate.insert(obj);
	}

	/**
	 * 批量新增
	 * 
	 * @param objectsToSave 数据对象集合
	 */
	public void insertAll(Collection<? extends Object> objectsToSave) {

		mongoTemplate.insertAll(objectsToSave);
	}

	/**
	 * 保存数据对象
	 * 
	 * @param obj 数据对象
	 */
	public void save(Object obj) {

		mongoTemplate.save(obj);
	}

	/**
	 * 指定集合保存数据对象
	 * 
	 * @param obj            数据对象
	 * @param collectionName 集合名
	 */
	public void save(Object obj, String collectionName) {

		mongoTemplate.save(obj, collectionName);
	}

	/**
	 * =================================== update
	 **/

	/**
	 * 指定集合 修改数据,且仅修改找到的第一条数据
	 * 
	 * @param according      修改条件
	 * @param updateMap      修改内容
	 * @param collectionName 集合名
	 */
	public int updateFirst(Map<String, Object> according, Map<String, Object> updateMap, String collectionName) {

		return update(according, updateMap, collectionName, false);
	}

	/**
	 * 指定集合 修改数据,且修改所找到的所有数据
	 * 
	 * @param according      修改条件
	 * @param updateMap      修改内容
	 * @param collectionName 集合名
	 */
	public int updateMulti(Map<String, Object> according, Map<String, Object> updateMap, String collectionName) {

		return update(according, updateMap, collectionName, true);
	}

	/**
	 * 指定集合 修改数据
	 * 
	 * @param according      修改条件
	 * @param updateMap      修改内容
	 * @param collectionName 集合名
	 * @param multi          是否更新全部
	 */
	public int update(Map<String, Object> according, Map<String, Object> updateMap, String collectionName,
			boolean multi) {

		Query query = Query.query(criteriaDefinition(according));
		Update update = new Update();
		for (Map.Entry<String, Object> e : updateMap.entrySet()) {
			update.set(e.getKey(), e.getValue());
		}
		WriteResult writeResult = update(query, update, collectionName, multi);
		return writeResult.getN();
	}

	/**
	 * 指定集合 修改数据
	 * 
	 * @param query          修改条件
	 * @param update         修改内容
	 * @param collectionName 集合名
	 * @param multi          是否更新全部
	 */
	public WriteResult update(Query query, Update update, String collectionName, boolean multi) {
		WriteResult writeResult = null;
		if (multi) {
			writeResult = mongoTemplate.updateMulti(query, update, collectionName);
		} else {
			writeResult = mongoTemplate.updateFirst(query, update, collectionName);
		}
		return writeResult;
	}

	/**
	 * 指定集合 修改数据,且仅修改找到的第一条数据
	 * 
	 * @param according   修改条件
	 * @param updateMap   修改内容
	 * @param entityClass 集合映射对象
	 */
	public <T> int updateFirst(Map<String, Object> according, Map<String, Object> updateMap, Class<T> entityClass) {

		return update(according, updateMap, entityClass, false);
	}

	/**
	 * 指定集合 修改数据,且修改所找到的所有数据
	 * 
	 * @param according   修改条件
	 * @param updateMap   修改内容
	 * @param entityClass 集合映射对象
	 */
	public <T> int updateMulti(Map<String, Object> according, Map<String, Object> updateMap, Class<T> entityClass) {

		return update(according, updateMap, entityClass, true);
	}

	/**
	 * 指定集合 修改数据
	 * 
	 * @param according   修改条件
	 * @param updateMap   修改内容
	 * @param entityClass 集合映射对象
	 * @param multi       是否更新全部
	 * @return
	 */
	public <T> int update(Map<String, Object> according, Map<String, Object> updateMap, Class<T> entityClass,
			boolean multi) {

		Query query = Query.query(criteriaDefinition(according));
		Update update = new Update();
		for (Map.Entry<String, Object> e : updateMap.entrySet()) {
			update.set(e.getKey(), e.getValue());
		}
		WriteResult writeResult = update(query, update, entityClass, multi);
		return writeResult.getN();
	}

	/**
	 * 指定集合 修改数据
	 * 
	 * @param query       修改条件
	 * @param update      修改内容
	 * @param entityClass 集合映射对象
	 * @param multi       是否更新全部
	 */
	public <T> WriteResult update(Query query, Update update, Class<T> entityClass, boolean multi) {
		WriteResult writeResult = null;
		if (multi) {
			writeResult = mongoTemplate.updateMulti(query, update, entityClass);
		} else {
			writeResult = mongoTemplate.updateFirst(query, update, entityClass);
		}
		return writeResult;
	}

	/**
	 * =================================== remove
	 **/

	/**
	 * 根据数据对象中的id删除数据
	 * 
	 * @param obj 数据对象
	 */
	public int remove(Object obj) {

		WriteResult writeResult = mongoTemplate.remove(obj);
		return writeResult.getN();
	}

	/**
	 * 指定集合 根据数据对象中的id删除数据
	 * 
	 * @param obj            数据对象
	 * @param collectionName 集合名
	 */
	public int remove(Object obj, String collectionName) {

		WriteResult writeResult = mongoTemplate.remove(obj, collectionName);
		return writeResult.getN();
	}

	/**
	 * 根据key,value到指定集合删除数据
	 * 
	 * @param according      删除条件
	 * @param collectionName 集合名
	 */
	public int remove(Map<String, Object> according, String collectionName) {

		Query query = Query.query(criteriaDefinition(according));
		WriteResult writeResult = mongoTemplate.remove(query, collectionName);
		return writeResult.getN();
	}

	/**
	 * 根据key,value到指定集合删除数据
	 * 
	 * @param query          删除条件
	 * @param collectionName 集合名
	 */
	public WriteResult remove(Query query, String collectionName) {
		return mongoTemplate.remove(query, collectionName);
	}

	/**
	 * 根据key,value到指定集合删除数据
	 * 
	 * @param according   删除条件
	 * @param entityClass 集合映射实体
	 */
	public <T> int remove(Map<String, Object> according, Class<T> entityClass) {

		Query query = Query.query(criteriaDefinition(according));
		WriteResult writeResult = mongoTemplate.remove(query, entityClass);
		return writeResult.getN();
	}

	/**
	 * 根据key,value到指定集合删除数据
	 * 
	 * @param query       删除条件
	 * @param entityClass 集合映射实体
	 */
	public <T> WriteResult remove(Query query, Class<T> entityClass) {

		return mongoTemplate.remove(query, entityClass);
	}

	/**
	 * =================================== find
	 **/

	/**
	 * 根据条件查询出所有结果集
	 * 
	 * @param <T>
	 * @param according   查询条件
	 * @param entityClass 集合映射实体
	 * @return
	 */
	public <T> List<T> find(Map<String, Object> according, Class<T> entityClass) {

		Query query = Query.query(criteriaDefinition(according));
		return mongoTemplate.find(query, entityClass);
	}

	/**
	 * 根据条件分页查询出所有结果集,降序
	 * 
	 * @param <T>
	 * @param according   查询条件
	 * @param pageIndex   当前页
	 * @param pageSize    每页显示
	 * @param sort        排序字段
	 * @param entityClass 集合映射实体
	 * @return
	 */
	public <T> List<T> find(Map<String, Object> according, int pageIndex, int pageSize, String sort,
			Class<T> entityClass) {

		Query query = Query.query(criteriaDefinition(according));
		query.skip((pageIndex - 1) * pageSize);
		query.limit(pageSize);
		if (!StringUtils.isEmpty(sort)) {
			query.with(new Sort(Direction.DESC, sort));
		}
		return mongoTemplate.find(query, entityClass);
	}

	/**
	 * 根据条件查询出所有结果集
	 * 
	 * @param <T>
	 * @param query       查询条件
	 * @param entityClass 集合映射实体
	 * @return
	 */
	public <T> List<T> find(Query query, Class<T> entityClass) {

		return mongoTemplate.find(query, entityClass);
	}

	/**
	 * 根据条件查询出所有结果集进行排序
	 * 
	 * @param <T>
	 * @param according   查询条件
	 * @param entityClass 集合映射实体
	 * @param sort        排序字段
	 * @param direction   排序方式
	 * @return
	 */
	public <T> List<T> find(Map<String, Object> according, String sort, String direction, Class<T> entityClass) {
		Query query = Query.query(criteriaDefinition(according));
		if ("DESC".equalsIgnoreCase(direction)) {
			query.with(new Sort(Direction.DESC, sort));
		} else {
			query.with(new Sort(Direction.ASC, sort));
		}
		return mongoTemplate.find(query, entityClass);
	}

	/**
	 * 根据条件查询出第一条数据
	 * 
	 * @param <T>
	 * @param according   查询条件
	 * @param entityClass 集合映射实体
	 * @return
	 */
	public <T> T findOne(Map<String, Object> according, Class<T> entityClass) {

		Query query = Query.query(criteriaDefinition(according));
		return mongoTemplate.findOne(query, entityClass);
	}

	/**
	 * 根据条件查询出第一条数据
	 * 
	 * @param <T>
	 * @param query       查询条件
	 * @param entityClass 集合映射实体
	 * @return
	 */
	public <T> T findOne(Query query, Class<T> entityClass) {

		return mongoTemplate.findOne(query, entityClass);
	}

	/**
	 * 查询出所有结果集
	 * 
	 * @param entityClass 数据对象
	 * @return
	 */
	public <T> List<T> findAll(Class<T> entityClass) {

		return mongoTemplate.findAll(entityClass);
	}

	/**
	 * 根据id查询数据
	 * 
	 * @param <T>
	 * @param id          查询id
	 * @param entityClass 集合映射实体
	 * @return
	 */
	public <T> T findById(Object id, Class<T> entityClass) {

		return mongoTemplate.findById(id, entityClass);
	}

	/**
	 * =================================== count
	 **/

	/**
	 * 根据指定条件统计数量
	 * 
	 * @param according   条件
	 * @param entityClass 集合映射实体
	 * @return
	 */
	public <T> long count(Map<String, Object> according, Class<T> entityClass) {

		Query query = Query.query(criteriaDefinition(according));
		return mongoTemplate.count(query, entityClass);
	}

	/**
	 * 根据指定条件统计数量
	 * 
	 * @param query       条件
	 * @param entityClass 集合映射实体
	 * @return
	 */
	public <T> long count(Query query, Class<T> entityClass) {

		return mongoTemplate.count(query, entityClass);
	}

	/**
	 * 根据指定条件统计数量
	 * 
	 * @param according      条件
	 * @param collectionName 集合名称
	 * @return
	 */
	public <T> long count(Map<String, Object> according, String collectionName) {

		Query query = Query.query(criteriaDefinition(according));
		return mongoTemplate.count(query, collectionName);
	}

	/**
	 * 根据指定条件统计数量
	 * 
	 * @param query          条件
	 * @param collectionName 集合名称
	 * @return
	 */
	public <T> long count(Query query, String collectionName) {

		return mongoTemplate.count(query, collectionName);
	}

	/**
	 * =================================== aggregation
	 **/
	
	/**
	 * 聚合查询
	 * 
	 * @param <T>
	 * @param aggregation    聚合
	 * @param collectionName 集合名称
	 * @param outputType     集合映射实体
	 * @return
	 */
	public <T> AggregationResults<T> aggregation(Aggregation aggregation, String collectionName, Class<T> outputType) {

		AggregationResults<T> results = mongoTemplate.aggregate(aggregation, collectionName, outputType);
		return results;
	}

	/**
	 * 聚合查询
	 * 
	 * @param <T>
	 * @param aggregation 聚合
	 * @param outputType  集合映射实体
	 * @return
	 */
	public <T> AggregationResults<T> aggregation(Aggregation aggregation, Class<T> outputType) {

		return mongoTemplate.aggregate(aggregation, outputType, outputType);
	}

	/**
	 * 条件定义
	 * 
	 * @param according 条件
	 * @return
	 */
	public Criteria criteriaDefinition(Map<String, Object> according) {

		if (CollectionUtils.isEmpty(according)) {
			return null;
		}
		int i = 0;
		Criteria criteria = null;

		for (Map.Entry<String, Object> e : according.entrySet()) {
			if (i == 0) {
				criteria = Criteria.where(e.getKey()).is(e.getValue());
				i++;
			} else {
				criteria.and(e.getKey()).is(e.getValue());
			}
		}
		return criteria;
	}
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!