(二)MongoDB的在SpringBoot中的应用
我来填之前MongoDB的坑了,项目中又用到MongoDB的我又想起来了,我这拖延症也是没谁了。
1、在pom.xml中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2、配置连接信息
在 application.yml 中加入以下连接信息,修改自己的mongodb的连接信息
spring:
#mongodb
data:
mongodb:
database: text
host: 192.168.1.24
port: 27017
# username: manager
# password: manager
3、创建MongoDB的配置类
@Configuration
public class MongoConfig {
@Value("${spring.data.mongodb.database}")
String db;
@Bean
public GridFSBucket getGridFSBuckets(MongoClient mongoClient) {
MongoDatabase database = mongoClient.getDatabase(db);
return GridFSBuckets.create(database);
}
}
4、存储数据、文件
在MongoDB中存储文件有两种方式,分别是将文件存储在表中和GridFS数据桶中;存储在表中的时候使用BSON(Binary JSON:二进制JSON)格式来存储数据,这种方式使用BSON(Binary JSON:二进制JSON)格式来存储数据;如果要存储大于16M的文件,就要用到MongoDB GridFS,GridFS是Mongo的一个子模块,使用GridFS可以基于MongoDB来持久存储文件。并且支持分布式应用(文件分布存储和读取)。作为MongoDB中二进制数据存储在数据库中的解决方案,通常用来处理大文件。
GridFS不是MongoDB自身特性,只是一种将大型文件存储在MongoDB的文件规范,所有官方支持的驱动均实现了GridFS规范。GridFS制定大文件在数据库中如何处理,通过开发语言驱动来完成、通过API接口来存储检索大文件。
1、以BSON格式来存储
创建实体类
/**
* @ClassName: ImageInfo
* @Description: mongoDB数据库图片表
* @Author: TanXJ
* @Date: 2021/10/12 11:09
*/
@Data
@Document
public class ImageInfo {
@Id
private String id;
/** 文件名 */
private String name;
/** 上传时间 */
private Date createdTime;
/** 文件内容 */
private Binary content;
/** 文件类型 */
private String contentType;
/** 文件大小 */
private long size;
public ImageInfo() {}
public ImageInfo(String name, Date createdTime, Binary content, String contentType, long size) {
this.name = name;
this.createdTime = createdTime;
this.content = content;
this.contentType = contentType;
this.size = size;
}
}
创建工具类
点击查看代码
import org.springframework.beans.factory.annotation.Autowired;
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.data.domain.Sort;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @ClassName: MongoUtils
* @Description: Mongodb工具类(将文件存储在数据表中)
* @Author: TanXJ
* @Date: 2021/10/12 10:41
*/
@Component
public class MongoUtils {
private static MongoTemplate mongoTemplate;
@Autowired
public void setRedisTemplate(MongoTemplate mongoTemplate) {
MongoUtils.mongoTemplate = mongoTemplate;
}
/**
* 保存数据对象,集合为数据对象中@Document 注解所配置的collection
* @param obj 数据对象
*/
public static void save(Object obj) {
mongoTemplate.save(obj);
}
/**
* 指定集合保存数据对象
* @param obj 数据对象
* @param collectionName 集合名
*/
public static void save(Object obj, String collectionName) {
mongoTemplate.save(obj, collectionName);
}
/**
* 根据数据对象中的id删除数据,集合为数据对象中@Document 注解所配置的collection
* @param obj 数据对象
*/
public static void remove(Object obj) {
mongoTemplate.remove(obj);
}
/**
* 指定集合 根据数据对象中的id删除数据
* @param obj 数据对象
* @param collectionName 集合名
*/
public static void remove(Object obj, String collectionName) {
mongoTemplate.remove(obj, collectionName);
}
/**
* 根据key,value到指定集合删除数据
* @param key 键
* @param value 值
* @param collectionName 集合名
*/
public static void removeById(String key, Object value, String collectionName) {
Query query = Query.query(Criteria.where(key).is(value));
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]);
}
mongoTemplate.updateFirst(query, update, collectionName);
}
/**
* 指定集合 修改数据,且修改所找到的所有数据
* @param accordingKey 修改条件 key
* @param accordingValue 修改条件 value
* @param updateKeys 修改内容 key数组
* @param updateValues 修改内容 value数组
* @param collectionName 集合名
*/
public static void updateMulti(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]);
}
mongoTemplate.updateMulti(query, update, collectionName);
}
/**
* 根据条件查询出所有结果集 集合为数据对象中@Document 注解所配置的collection
* @param obj 数据对象
* @param findKeys 查询条件 key
* @param findValues 查询条件 value
* @return
*/
public static List<? extends Object> find(Object obj, String[] findKeys, Object[] findValues) {
Criteria criteria = null;
for (int i = 0; i < findKeys.length; i++) {
if (i == 0) {
criteria = Criteria.where(findKeys[i]).is(findValues[i]);
} else {
criteria.and(findKeys[i]).is(findValues[i]);
}
}
Query query = Query.query(criteria);
List<? extends Object> resultList = mongoTemplate.find(query, obj.getClass());
return resultList;
}
/**
* 指定集合 根据条件查询出所有结果集
* @param obj 数据对象
* @param findKeys 查询条件 key
* @param findValues 查询条件 value
* @param collectionName 集合名
* @return
*/
public static List<? extends Object> find(Object obj, String[] findKeys, Object[] findValues, String collectionName) {
Criteria criteria = null;
for (int i = 0; i < findKeys.length; i++) {
if (i == 0) {
criteria = Criteria.where(findKeys[i]).is(findValues[i]);
} else {
criteria.and(findKeys[i]).is(findValues[i]);
}
}
Query query = Query.query(criteria);
List<? extends Object> resultList = mongoTemplate.find(query, obj.getClass(), collectionName);
return resultList;
}
/**
* 指定集合 根据条件查询出所有结果集 并排倒序
* @param obj 数据对象
* @param findKeys 查询条件 key
* @param findValues 查询条件 value
* @param collectionName 集合名
* @param sort 排序字段
* @return
*/
public static List<? extends Object> find(Object obj, String[] findKeys, Object[] findValues, String collectionName ,String sort) {
Criteria criteria = null;
for (int i = 0; i < findKeys.length; i++) {
if (i == 0) {
criteria = Criteria.where(findKeys[i]).is(findValues[i]);
} else {
criteria.and(findKeys[i]).is(findValues[i]);
}
}
Query query = Query.query(criteria);
query.with(Sort.by(Sort.Direction.DESC, sort));
List<? extends Object> resultList = mongoTemplate.find(query, obj.getClass(), collectionName);
return resultList;
}
/**
* 根据条件查询出符合的第一条数据 集合为数据对象中 @Document 注解所配置的collection
* @param obj 数据对象
* @param findKeys 查询条件 key
* @param findValues 查询条件 value
* @return
*/
public static Object findOne(Object obj, String[] findKeys, Object[] findValues) {
Criteria criteria = null;
for (int i = 0; i < findKeys.length; i++) {
if (i == 0) {
criteria = Criteria.where(findKeys[i]).is(findValues[i]);
} else {
criteria.and(findKeys[i]).is(findValues[i]);
}
}
Query query = Query.query(criteria);
Object resultObj = mongoTemplate.findOne(query, obj.getClass());
return resultObj;
}
/**
* 指定集合 根据条件查询出符合的第一条数据
* @param obj 数据对象
* @param findKeys 查询条件 key
* @param findValues 查询条件 value
* @param collectionName 集合名
* @return
*/
public static Object findOne(Object obj, String[] findKeys, Object[] findValues, String collectionName) {
Criteria criteria = null;
for (int i = 0; i < findKeys.length; i++) {
if (i == 0) {
criteria = Criteria.where(findKeys[i]).is(findValues[i]);
} else {
criteria.and(findKeys[i]).is(findValues[i]);
}
}
Query query = Query.query(criteria);
Object resultObj = 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 = mongoTemplate.findAll(obj.getClass());
return resultList;
}
/**
* 查询出所有结果集 集合为数据对象中 @Document 注解所配置的collection
* @param clazz
* @param <T>
* @return
*/
public static <T> List<T> findAll(Class<T> clazz){
List<T> resultList = mongoTemplate.findAll(clazz);
return resultList;
}
/**
* 指定集合 查询出所有结果集
* @param obj 数据对象
* @param collectionName 集合名
* @return
*/
public static List<? extends Object> findAll(Object obj, String collectionName) {
List<? extends Object> resultList = mongoTemplate.findAll(obj.getClass(), collectionName);
return resultList;
}
/**
* 指定集合 查询出所有结果集
* @param clazz
* @param collectionName
* @param <T>
* @return
*/
public static <T> List<T> findAll(Class<T> clazz, String collectionName) {
List<T> resultList = mongoTemplate.findAll(clazz, collectionName);
return resultList;
}
}
在代码中进行使用
ImageInfo imageInfo = new ImageInfo(fileName, new Date(), binary, suffixName, file.getSize());
MongoUtils.save(imageInfo);
2、以GridFS方式存储
点击查看代码
/**
* @ClassName: GridFsUtils
* @Description: Mongodb工具类(将文件存储在GridFs中)
* @Author: TanXJ
* @Date: 2021/10/13 14:31
*/
@Component
public class GridFsUtils {
private static GridFsTemplate gridFsTemplate;
private static GridFSBucket gridFSBucket;
@Autowired
public void setRedisTemplate(GridFsTemplate gridFsTemplate) {
GridFsUtils.gridFsTemplate = gridFsTemplate;
}
@Autowired
public void setRedisTemplate(GridFSBucket gridFSBucket) {
GridFsUtils.gridFSBucket = gridFSBucket;
}
/**
* GridFs存储文件
* 将文件按大小256k分割存到mongodb数据库
* 将分割后的文件分记录存到fs.files表
* 将完整文件信息存到fs.chunks表
*
* @param file
* @throws FileNotFoundException
*/
public static String storeFilesToGridFs(MultipartFile file) throws IOException {
// 文件名
String name = file.getOriginalFilename();
// 获取文件类型
String contenType = file.getContentType();
//将要存储的文件写入输入流
InputStream inputStream = file.getInputStream();
//文件开始存储
ObjectId objectId = gridFsTemplate.store(inputStream, name, contenType);
//获取存储的文件id
String fileId = objectId.toString();
return fileId;
}
/**
* GridFs读取文件
* 读取数据库中的文件,以字符形式展示
*
* @param id
* @return byte[]
* @throws IOException
*/
public static byte[] readFile(String id) {
byte[] bytes = null;
try {
//根据文件id查询文件
GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id)));
//使用GridFsBucket打开一个下载流对象
GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
//创建GridFsResource对象,获取流
GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);
//从流中取数据
InputStream inputStream = gridFsResource.getInputStream();
bytes = ByteStreams.toByteArray(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
return bytes;
}
/**
* GridFs删除文件
*/
public static void deleteFile(String id){
//根据文件id删除fs.files表和fs.chunks表中的记录
gridFsTemplate.delete(Query.query(Criteria.where("_id").is(id)));
}
}
*** 可能还有些不足的地方,还请多多指教 ***
(二)MongoDB的在SpringBoot中的应用的更多相关文章
- mongodb基本操作和在springboot中的使用
本文介绍mongodb的使用 说明 起步 mongo通用类型 mongoshell的操作 CRUD操作 shell命令操作 索引操作 mongo在springboot中的使用 目录结构 依赖 prop ...
- SpringBoot学习笔记(10)-----SpringBoot中使用Redis/Mongodb和缓存Ehcache缓存和redis缓存
1. 使用Redis 在使用redis之前,首先要保证安装或有redis的服务器,接下就是引入redis依赖. pom.xml文件如下 <dependency> <groupId&g ...
- springboot中使用spring-session实现共享会话到redis(二)
上篇文章介绍了springboot中集成spring-session实现了将session分布式存到redis中.这篇在深入介绍一些spring-session的细节. 1.session超时: 在t ...
- (二)Redis在Mac下的安装与SpringBoot中的配置
1 下载Redis 官网下载,下载 stable 版本,稳定版本. 2 本地安装 解压:tar zxvf redis-6.0.1.tar.gz 移动到: sudo mv redis-6.0.1 /us ...
- SpringBoot中如何灵活的实现接口数据的加解密功能?
数据是企业的第四张名片,企业级开发中少不了数据的加密传输,所以本文介绍下SpringBoot中接口数据加密.解密的方式. 本文目录 一.加密方案介绍二.实现原理三.实战四.测试五.踩到的坑 一.加密方 ...
- SpringBoot中如何优雅的读取yml配置文件?
YAML是一种简洁的非标记语言,以数据为中心,使用空白.缩进.分行组织数据,从而使得表示更加简洁易读.本文介绍下YAML的语法和SpringBoot读取该类型配置文件的过程. 本文目录 一.YAML基 ...
- SpringBoot中yaml配置对象
转载请在页首注明作者与出处 一:前言 YAML可以代替传统的xx.properties文件,但是它支持声明map,数组,list,字符串,boolean值,数值,NULL,日期,基本满足开发过程中的所 ...
- Springboot中使用AOP统一处理Web请求日志
title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...
- SpringBoot中对于异常处理的提供的五种处理方式
1.自定义错误页面 SpringBoot 默认的处理异常机制:SpringBoot默认的已经提供了一套处理异常的机制.一旦程序中出现了异常,SpringBoot会向/error的url发送请求.在Sp ...
- SpringBoot中异步请求和异步调用(看这一篇就够了)
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10661591.html,否则将追究法律责任!!! 一.SpringBoot中异步请求的使用 ...
随机推荐
- 一周万星的文本转语音开源项目「GitHub 热点速览」
上周的热门开源项目让我想起了「图灵测试」,测试者在不知道对面是机器还是人类的前提下随意提问,最后根据对方回复的内容,判断与他们交谈的是人还是计算机.如果无法分辨出回答者是机器还是人类,则说明机器已通过 ...
- k8s组件和网络插件挂掉,演示已有的pod是否正常运行
环境 03 master ,05 06是node [root@mcwk8s03 mcwtest]# kubectl get nodes -o wide NAME STATUS ROLES AGE VE ...
- MySQL入门到精通(十):SQL优化第一篇(2021最新发布)
SQL优化 1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,创建表时N ...
- react 网络请求 axios
react中通过npm来安装axios扩展 cnpm i -S axios 发起请求 import React, { Component } from 'react' import axios fro ...
- NCNN的内存显存分配器ncnn::Allocator & ncnn::VkAllocator翻译及其差异对比的学习笔记(nihui亲审过滴)
NCNN的内存分配器 ncnn::Allocator 通用内存分配器 ncnn::PoolAllocator 内存池分配器 可以设置池大小,减少分配内存和析构内存次数,空间换时间 ncnn:: ...
- The solution of CF380C
problem 希望这篇题解不要明年才审完. 标签:线段树 记录 \(Lsum_p\) 为这个区间有多少个 ( 不能匹配,\(Rsum_p\) 为这个区间有多少个 ) 不能匹配. 对于叶子结点如果是 ...
- Codeforces Round 923 (Div. 3) 比赛记录
Codeforces Round 923 (Div. 3) 这是我第二次参加 cf阴间场. 10 minutes ago: 这次报名人数超过 4 万,一开始网站就崩溃了,比赛延迟了 10 分钟..开局 ...
- golang sync.Once 保证某个动作仅执行一次的机制
type Once struct { done atomic.Uint32 m Mutex } 这段代码是 Go 语言标准库中 sync 包的一部分,定义了一个 Once 类型.Once 类型用于确保 ...
- 夜莺监控发布 v6.7 版本,推送部分商业版功能
熟悉夜莺的小伙伴都知道夜莺分为开源版.专业版.企业版,三个版本良性发展.近期夜莺团队发布了 v6.7 版本,把机器Metadata管理功能推送到了开源版,下面是该功能的简单介绍. 如上图,机器列表页面 ...
- netcore 打包dll发布到nuget服务器
可参考微软官网:NuGet.org 概述 | Microsoft Docs 一.创建类库 首先创建一个类库,就是你想要发布到nuget的类库,生成项目 二.下载并注册nuget nuget地址:htt ...