我来填之前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. FRDM-MCXN947开发板之RGB灯

    一.背景 RGB LED:通过红.绿.蓝三种颜色组合发光的LED,可以理解由三个不同发光属性的LED组成,这个是LCD平板显示原理的基础,一个LED相当于屏幕上面的一个像素 FRDM-MCXN947集 ...

  2. Linux和Windows时间不一致问题

    问题描述 装过双系统或者虚拟机装Linux的人都知道,Linux的时间和Windows往往是不同步的,在编写跨平台程序的时候特别是对时间敏感的代码就带来很大的困扰 解决办法 这个问题可以在Linux下 ...

  3. 7.26考试总结(NOIP模拟24)[matrix·block·graph]

    你那无聊的幻想,就由我来打破! 前言 补坑中.. 我都不知道自己这场模拟赛怎么打的了. 非常玄学,前三个小时一直在想正解,然后最后 20min 感觉 T1 不太稳,就又加上了一个暴力. 后来一看只有最 ...

  4. [经验分享] VPS安装爱快

    前言:本人是作VPN服务端用,配合域名分流,蛮好用.参考1.送一个阿里云腾讯云安装爱快3.X的文档https://bbs.ikuai8.com/thread-97314-1-1.htmlVPS存在的问 ...

  5. zkq 数学听课笔记

    线性代数 域 \(F\),OI 中常用的域是 \(\Z_{p^c}\). \(n\) 维向量 \(\vec x \in F^n\),其中 \(x_i \in F\),注意向量是列向量. \(F^n\) ...

  6. Python 潮流周刊#54:ChatTTS 强大的文本生成语音模型

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  7. LeetCode 678. Valid Parenthesis String 有效的括号字符串 (C++/Java)

    题目: Given a string containing only three types of characters: '(', ')' and '*', write a function to ...

  8. fontawesome-webfont.woff:1 Failed to load resource: the server responded with a status of 404 ()

    fontawesome-webfont.woff2:1 Failed to load resource: the server responded with a status of 404 ()fon ...

  9. __proto__和[[Prototype]]的区别

    __proto__和[[Prototype]]的区别 先看下面这一段代码: const obj1 = Object.create(null); // very plain object obj1.__ ...

  10. xshell和xftp下载免费版本方法

    下载地址 https://www.xshell.com/zh/free-for-home-school/ 填写邮箱和用户名,会发送下载邮件到邮箱,然后根据邮箱中的下载地址来下载安装.