小太阳的博客

SpringBoot操作MongoDB

POM依赖

<!-- MongoDB -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- spring Mongo配置包 -->
<dependency>
    <groupId>com.spring4all</groupId>
    <artifactId>mongodb-plus-spring-boot-starter</artifactId>
    <version>1.0.0.RELEASE</version>
</dependency>

配置

#MongoDB
spring:
  data:
    mongodb:
    	#单机连接配置
      uri: mongodb://admin:admin@11.22.33.44:12345/cache
      #副本集连接配置
      uri: mongodb://admin:admin@11.22.33.44:12345,12.22.32.42:12345,13.23.33.43:12345/cache
      option:
        socket-timeout: 20000
        heartbeat-socket-timeout: 20000
        max-connection-per-host: 500
        threads-allowed-to-block-for-connection-multiplier: 500
        max-wait-time: 10000
        min-heartbeat-frequency: 100
        heartbeat-frequency: 10000
        max-connection-idle-time: 50000
        max-connection-life-time: 0
#配置MongoTemplate日志
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG

更多配置说明

#mongo配置
#mongo服务的端口号
spring.data.mongodb.port=27017
#mongo服务的地址
spring.data.mongodb.host=xxxxxx
#mongo服务的登录名称
spring.data.mongodb.username=xxxxx
#mongo服务的密码
spring.data.mongodb.password=xxxxxxx
#此人的验证数据库
spring.data.mongodb.authentication-database=xxxxxxxx
#待连接数据库
spring.data.mongodb.database=xxxxxxxx
#mongo最大的池子数
spring.data.mongodb.option.max-connection-per-host=100
#设置允许阻塞等待连接的线程数的乘数。
spring.data.mongodb.option.threads-allowed-to-block-for-connection-multiplier=5
#套接字选择超时时间
spring.data.mongodb.option.server-selection-timeout=30000
#最大等待时间
spring.data.mongodb.option.max-wait-time=120000
#池化连接的最大空闲时间。零值表示空闲时间没有限制。超出其空闲时间的池化连接将被关闭,并在必要时由新连接替换。
spring.data.mongodb.option.max-connection-idle-time=300000
#服务器断开时间
spring.data.mongodb.option.max-connection-idle-time=300000
#连接超时实际那
spring.data.mongodb.option.connect-timeout=10000
# 设置套接字超时
spring.data.mongodb.option.socket-timeout=0
#会话一直存在的会引发socket异常
spring.data.mongodb.option.socket-keep-alive=false
#设置启用SSL
spring.data.mongodb.option.ssl-enabled=false
#定义是否允许使用无效的主机名。
spring.data.mongodb.option.ssl-invalid-host-name-allowed=false
#设置驱动程序注册的JMX bean是否应始终为MBean,无论VM是Java还是更高版本。
spring.data.mongodb.option.always-use-m-beans=false
#设置用于群集心跳的连接的套接字超时。
spring.data.mongodb.option.heartbeat-socket-timeout=20000
#设置用于群集心跳的连接的连接超时。
spring.data.mongodb.option.heartbeat-connect-timeout=20000
#设置最小心跳频率。如果驱动程序必须经常重新检查服务器的可用性,它将至少在上一次检查后等待很长时间,以避免浪费精力。默认值为500毫秒。
spring.data.mongodb.option.min-heartbeat-frequency=500
#设置心跳频率。这是驱动程序将尝试确定群集中每个服务器的当前状态的频率。默认值为10,000毫秒
spring.data.mongodb.option.heartbeat-frequency=10000
#可配置默认值为15毫秒
spring.data.mongodb.option.local-threshold=15

启动类

//重点是添加这个注解,配置才能生效 - @EnableMongoPlus
@EnableMongoPlus
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

工具类 - 常用

package cn.javaex.springboot.util;
import java.util.List;
 
import javax.annotation.PostConstruct;
 
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.MongoTemplate;
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.Component;

/**
 * MongoDB 工具类
 */
@Component
public class MongoDBUtils {

	public static MongoDBUtils mongoDBUtils;
	
	@Autowired
	private MongoTemplate mongoTemplate;

	@PostConstruct
	public void init() {
		mongoDBUtils = this;
	}
	
	/**
	 * 保存数据对象,集合为数据对象中@Document 注解所配置的collection
	 * 
	 * @param obj 数据对象
	 */
	public static void save(Object obj) {
		mongoDBUtils.mongoTemplate.save(obj);
	}

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

	/**
	 * 根据数据对象中的id删除数据,集合为数据对象中@Document 注解所配置的collection
	 * 
	 * @param obj 数据对象
	 */
	public static void delete(Object obj) {
		mongoDBUtils.mongoTemplate.remove(obj);
	}

	/**
	 * 指定集合 根据数据对象中的id删除数据
	 * 
	 * @param obj 数据对象
	 * @param collectionName 集合名
	 */
	public static void delete(Object obj, String collectionName) {
		mongoDBUtils.mongoTemplate.remove(obj, collectionName);
	}

	/**
	 * 根据key,value到指定集合删除数据
	 * 
	 * @param key 键
	 * @param value 值
	 * @param collectionName 集合名
	 */
	public static void deleteByKey(String key, Object value, String collectionName) {
		Query query = new Query();
		query.addCriteria(new Criteria(key).is(value));
		mongoDBUtils.mongoTemplate.remove(query, collectionName);
	}

	/**
	 * 指定集合 修改数据,且仅修改找到的第一条数据
	 * 
	 * @param accordingKey 修改条件 key
	 * @param accordingValue 修改条件 value
	 * @param updateKeys 修改内容 key数组
	 * @param updateValues 修改内容 value数组
	 * @param collectionName 集合名
	 */
	public static void updateFirst(String accordingKey, Object accordingValue,
			String[] updateKeys, Object[] updateValues, String collectionName) {
		Criteria criteria = Criteria.where(accordingKey).is(accordingValue);
		Query query = Query.query(criteria);
		Update update = new Update();
		for (int i=0; i<updateKeys.length; i++) {
			update.set(updateKeys[i], updateValues[i]);
		}
		mongoDBUtils.mongoTemplate.updateFirst(query, update, collectionName);
	}

	/**
	 * 指定集合修改数据,且修改所找到的所有数据
	 * 
	 * @param accordingKey 修改条件 key
	 * @param accordingValue 修改条件 value
	 * @param updateKeys 修改内容 key数组
	 * @param updateValues 修改内容 value数组
	 * @param collectionName 集合名
	 */
	public static void updateAll(String accordingKey, Object accordingValue,
			String[] updateKeys, Object[] updateValues, String collectionName) {
		Criteria criteria = Criteria.where(accordingKey).is(accordingValue);
		Query query = Query.query(criteria);
		Update update = new Update();
		for (int i = 0; i < updateKeys.length; i++) {
			update.set(updateKeys[i], updateValues[i]);
		}
		mongoDBUtils.mongoTemplate.updateMulti(query, update, collectionName);
	}

	/**
	 * 根据条件查询出所有结果集 集合为数据对象中@Document 注解所配置的collection
	 * 
	 * @param obj 数据对象
	 * @param findKeyArr 查询条件 key
	 * @param findValueArr 查询条件 value
	 * @return
	 */
	public static List<? extends Object> find(Object obj, String[] findKeyArr, Object[] findValueArr) {
		Criteria criteria = null;
		for (int i=0; i<findKeyArr.length; i++) {
			if (i==0) {
				criteria = Criteria.where(findKeyArr[i]).is(findValueArr[i]);
			} else {
				criteria.and(findKeyArr[i]).is(findValueArr[i]);
			}
		}
		Query query = Query.query(criteria);
		List<? extends Object> resultList = mongoDBUtils.mongoTemplate.find(query, obj.getClass());
		return resultList;
	}

	/**
	 * 指定集合 根据条件查询出所有结果集
	 * 
	 * @param obj 数据对象
	 * @param findKeyArr 查询条件 key
	 * @param findValueArr 查询条件 value
	 * @param collectionName 集合名
	 * @return
	 */
	public static List<? extends Object> find(Object obj, String[] findKeyArr, Object[] findValueArr, String collectionName) {
		Criteria criteria = null;
		for (int i=0; i<findKeyArr.length; i++) {
			if (i==0) {
				criteria = Criteria.where(findKeyArr[i]).is(findValueArr[i]);
			} else {
				criteria.and(findKeyArr[i]).is(findValueArr[i]);
			}
		}
		Query query = Query.query(criteria);
		List<? extends Object> resultList = mongoDBUtils.mongoTemplate.find(query, obj.getClass(), collectionName);
		return resultList;
	}
	
	/**
	 * 指定集合 根据条件查询出所有结果集 并排倒序
	 * 
	 * @param obj 数据对象
	 * @param findKeyArr 查询条件 key
	 * @param findValueArr 查询条件 value
	 * @param collectionName 集合名
	 * @param sort 排序字段
	 * @return
	 */
	public static List<? extends Object> find(Object obj, String[] findKeyArr, Object[] findValueArr, String collectionName ,String sort) {
		Criteria criteria = null;
		for (int i = 0; i < findKeyArr.length; i++) {
			if (i == 0) {
				criteria = Criteria.where(findKeyArr[i]).is(findValueArr[i]);
			} else {
				criteria.and(findKeyArr[i]).is(findValueArr[i]);
			}
		}
		Query query = Query.query(criteria);
		query.with(new Sort(Direction.DESC, sort));
		List<? extends Object> resultList = mongoDBUtils.mongoTemplate.find(query, obj.getClass(), collectionName);
		return resultList;
	}

	/**
	 * 根据条件查询出符合的第一条数据 集合为数据对象中 @Document 注解所配置的collection
	 * 
	 * @param obj 数据对象
	 * @param findKeyArr 查询条件 key
	 * @param findValueArr 查询条件 value
	 * @return
	 */
	public static Object findOne(Object obj, String[] findKeyArr, Object[] findValueArr) {
		Criteria criteria = null;
		for (int i=0; i<findKeyArr.length; i++) {
			if (i==0) {
				criteria = Criteria.where(findKeyArr[i]).is(findValueArr[i]);
			} else {
				criteria.and(findKeyArr[i]).is(findValueArr[i]);
			}
		}
		Query query = Query.query(criteria);
		Object resultObj = mongoDBUtils.mongoTemplate.findOne(query, obj.getClass());
		return resultObj;
	}
 
	/**
	 * 指定集合 根据条件查询出符合的第一条数据
	 * 
	 * @param obj 数据对象
	 * @param findKeyArr 查询条件 key
	 * @param findValueArr 查询条件 value
	 * @param collectionName 集合名
	 * @return
	 */
	public static Object findOne(Object obj, String[] findKeyArr, Object[] findValueArr, String collectionName) {
		Criteria criteria = null;
		for (int i=0; i<findKeyArr.length; i++) {
			if (i==0) {
				criteria = Criteria.where(findKeyArr[i]).is(findValueArr[i]);
			} else {
				criteria.and(findKeyArr[i]).is(findValueArr[i]);
			}
		}
		Query query = Query.query(criteria);
		Object resultObj = mongoDBUtils.mongoTemplate.findOne(query, obj.getClass(), collectionName);
		return resultObj;
	}

	/**
	 * 查询出所有结果集 集合为数据对象中 @Document 注解所配置的collection
	 * 
	 * @param obj 数据对象
	 * @return
	 */
	public static List<? extends Object> findAll(Object obj) {
		List<? extends Object> resultList = mongoDBUtils.mongoTemplate.findAll(obj.getClass());
		return resultList;
	}

	/**
	 * 指定集合 查询出所有结果集
	 * 
	 * @param obj 数据对象
	 * @param collectionName 集合名
	 * @return
	 */
	public static List<? extends Object> findAll(Object obj, String collectionName) {
		List<? extends Object> resultList = mongoDBUtils.mongoTemplate.findAll(obj.getClass(), collectionName);
		return resultList;
	}
}

Copyright © 2023,版权所有 - 小太阳的博客 - 黑ICP备2023000004号