我来填之前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中的应用的更多相关文章

  1. mongodb基本操作和在springboot中的使用

    本文介绍mongodb的使用 说明 起步 mongo通用类型 mongoshell的操作 CRUD操作 shell命令操作 索引操作 mongo在springboot中的使用 目录结构 依赖 prop ...

  2. SpringBoot学习笔记(10)-----SpringBoot中使用Redis/Mongodb和缓存Ehcache缓存和redis缓存

    1. 使用Redis 在使用redis之前,首先要保证安装或有redis的服务器,接下就是引入redis依赖. pom.xml文件如下 <dependency> <groupId&g ...

  3. springboot中使用spring-session实现共享会话到redis(二)

    上篇文章介绍了springboot中集成spring-session实现了将session分布式存到redis中.这篇在深入介绍一些spring-session的细节. 1.session超时: 在t ...

  4. (二)Redis在Mac下的安装与SpringBoot中的配置

    1 下载Redis 官网下载,下载 stable 版本,稳定版本. 2 本地安装 解压:tar zxvf redis-6.0.1.tar.gz 移动到: sudo mv redis-6.0.1 /us ...

  5. SpringBoot中如何灵活的实现接口数据的加解密功能?

    数据是企业的第四张名片,企业级开发中少不了数据的加密传输,所以本文介绍下SpringBoot中接口数据加密.解密的方式. 本文目录 一.加密方案介绍二.实现原理三.实战四.测试五.踩到的坑 一.加密方 ...

  6. SpringBoot中如何优雅的读取yml配置文件?

    YAML是一种简洁的非标记语言,以数据为中心,使用空白.缩进.分行组织数据,从而使得表示更加简洁易读.本文介绍下YAML的语法和SpringBoot读取该类型配置文件的过程. 本文目录 一.YAML基 ...

  7. SpringBoot中yaml配置对象

    转载请在页首注明作者与出处 一:前言 YAML可以代替传统的xx.properties文件,但是它支持声明map,数组,list,字符串,boolean值,数值,NULL,日期,基本满足开发过程中的所 ...

  8. Springboot中使用AOP统一处理Web请求日志

    title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...

  9. SpringBoot中对于异常处理的提供的五种处理方式

    1.自定义错误页面 SpringBoot 默认的处理异常机制:SpringBoot默认的已经提供了一套处理异常的机制.一旦程序中出现了异常,SpringBoot会向/error的url发送请求.在Sp ...

  10. SpringBoot中异步请求和异步调用(看这一篇就够了)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10661591.html,否则将追究法律责任!!! 一.SpringBoot中异步请求的使用 ...

随机推荐

  1. JavaServlet和后端的搭建(以Tomcat为例)

    目录 Servlet 前端如何才能访问到后端? 后端开发准备工作(配置Tomcat) 对象的生命周期 后端平台的搭建 创建Web项目(前提搭建好Tomcat配置) 创建Java文件 配置Web.xml ...

  2. vue3 KeepAlive

    在Vue.js 3中,<keep-alive> 是一个抽象组件,用于保留其子组件状态,防止在切换组件时销毁它们.这对于在页面间切换时保留组件的状态或避免重复渲染特定组件非常有用.<k ...

  3. 面向对象编程 es5和es6的构造函数

     /*         面向对象编程                          本质 创建一个对象                  可以用 属性属性值的 方式 存储 数据参数         ...

  4. SELinux(一) 简介

    首发公号:Rand_cs 前段时间的工作遇到了一些关于 SELinux 的问题,初次接触不熟悉此概念,导致当时配置策略时束手束脚,焦头烂额,为此去系统的学习了下 SELinux 的东西.聊 SELin ...

  5. Codeforces Round 923 (Div. 3) 比赛记录

    Codeforces Round 923 (Div. 3) 这是我第二次参加 cf阴间场. 10 minutes ago: 这次报名人数超过 4 万,一开始网站就崩溃了,比赛延迟了 10 分钟..开局 ...

  6. 如何基于R包做GO分析?实现秒出图

    GO分析 基因本体论(Gene Ontology, GO)是一个用于描述基因和基因产品属性的标准术语体系.它提供了一个有组织的方式来表示基因在生物体内的各种角色.基因本体论通常从三个层面对基因进行描述 ...

  7. ssm框架使springmvc放行资源(java配置类)

    在springmvc中,如果配置了拦截所有请求交给springmvc处理,会出现一些静态web资源加载不出来的情况,或者想放行指定web资源可以通过修改通过修改配置达到相应目的,这里使用覆写WebMv ...

  8. UIController转为SwiftUI

    在UIKit转到SwiftUI的过渡时期中,项目中会遇到不得不用到二者混合使用的情景,苹果这时提供了相关API让iOSer更好地适应这个时期. UIViewControllerRepresentabl ...

  9. 如何在Spring Boot框架下实现高效的Excel服务端导入导出?

    前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置 ...

  10. AGC044C Strange Dance

    在2020年A卷省选day2t2有类似操作trie的技巧. 题目链接 显然是建一棵三叉trie树,代表0/1/2 对这棵trie树,我们需要支持子树交换和全局加1 考虑第一个操作怎么做?直接打个懒标记 ...