(二)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中异步请求的使用 ...
随机推荐
- Typora编写博客并发布
(1)工具安装:下载博主xhznl开发的的工具,并按照说明进行正确的配置. EasyBlogImageForTypora使用说明:https://www.cnblogs.com/xhznl/p/132 ...
- Grafana监控系统的构建与实践
本文深入探讨了Grafana的核心技术.数据源集成.仪表盘与可视化构建以及监控与告警配置,旨在为专业从业者提供全面的Grafana技术指南. 关注[TechLeadCloud],分享互联网架构.云服务 ...
- xv6 磁盘中断流程和启动时调度流程
首发公号:Rand_cs 本文讲述 xv6 中的一些细节流程,还有对之前文中遗留的问题做一些补充说明,主要有以下几个问题: 一次完整的磁盘中断流程 进入调度器后的详细流程 sched 函数中的条件判断 ...
- LeetCode 208. Implement Trie (Prefix Tree) 实现 Trie (前缀树)(C++/Java)
题目: Implement a trie with insert, search, and startsWith methods. Example: Trie trie = new Trie(); t ...
- 手机上玩 PC 游戏的开源项目「GitHub 热点速览」
上周国产 3A 大作<黑神话:悟空>开启预售,同时公布游戏将于北京时间 2024.8.20 正式上线.这是一款由「游戏科学」开发的西游题材单机·动作·角色扮演游戏,它采用「虚幻引擎5」制作 ...
- List集合中的元素进行排序
Collections对List集合中的数据进行排序 有时候需要对集合中的元素按照一定的规则进行排序,这就需要用到Java中提供的对集合进行操作的工具类Collections,其中的sort方法 1 ...
- Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map寻找方式,Java Map定义和初始化方法
Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map寻找方式,Java Map定义和初 ...
- CentOS7学习笔记(七) 磁盘管理
查看硬盘分区信息 在Linux中使用lsblk命令查看硬盘以及分区信息 [root@192 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda ...
- SingletonKit单例源码阅读学习
阅读学习QFramwork中的SingletonKit源码. Singleton 普通类的单例 作为最常用的单例模块,通过继承单例泛型类来实现,需要私有构造: //使用第一种接口单例方式 intern ...
- 十大java应用服务器(web server)总结
java应用服务器(web server),是指运行java程序的web应用服务器软件,不包括nginx.Apache等通用web服务器软件. 一.Tomcat Tomcat是Apache 软件基金会 ...